当前位置: 首页 > news >正文

JVM基础(2)——JVM内存模型

一、简介

JVM会加载类到内存中,所以 JVM 中必然会有一块内存区域来存放我们写的那些类。Java中有类对象、普通对象、本地变量、方法信息等等各种对象信息,所以JVM会对内存区域进行划分:

JDK1.8及以后,上图中的方法区变成了Metaspace——元数据区。

我们本章的目的,就是介绍JVM中各块内存区域的功能,其中都是存放的哪些java对象信息。

二、方法区

方法区只存在于JDK1.8以前的版本,主要是存储从”.class“文件里加载进来的类,包括 类的名称 、 方法信息 、 字段信息 、 静态变量 、 常量 以及 编译器编译后的代码 等。从JDK1.8开始,这块区域的名字改成了元数据区(Metaspace),元数据区直接使用本地内存。

默认情况下,元数据区会根据使用情况动态调整,避免了在JDK1.8以前由于加载类过多从而出现 java.lang.OutOfMemoryError: PermGen。但也不能无限扩展,因此可以使用 -XX:MaxMetaspaceSize来控制最大内存。

以上一章的示例来看,Kafka.class和ReplicaManager.class加载到JVM后,会放到方法区中:

    public class Kafka {public static void main(String[] args) {ReplicaManager manager = new ReplicaManager();}}

方法区/元数据区是所有线程共享的:

三、程序计数器

程序计数器,用来记录当前线程正在执行的字节码指令。我们还是继续以上一章的代码作为示例来讲解:

    public class Kafka {public static void main(String[] args) {ReplicaManager manager = new ReplicaManager();manager.loadReplicaFromDisk();}}

首先,上面这段.java源程序会被编译成.class文件,.class中存放的是JVM可以读懂的字节码,比如下面这样

    public java.lang.String getName();descriptor: ()Ljava/lang/String;flags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: get_field    #24: areturn

当JVM加载类信息到内存之后,实际就会使用自己的 字节码执行引擎 ,去执行这些字节码指令,如下图:

程序计数器的作用就在这里,它会 记录当前执行的字节码指令的位置 ,如下图:

程序计数器是 线程私有 的,也就是说每个线程都有个自己的程序计数器,记录当前线程执行到了哪一条字节码指令:

四、Java虚拟机栈

Java虚拟机栈,其实是一种表示Java方法执行的数据结构。每个方法被执行的时候,都会创建一个栈帧(Stack Frame)用于存储 局部变量表 、 操作栈 、 动作链接 、 方法出口 等信息。每个方法从被调用到执行完成的过程,其实就是一个栈帧在虚拟机栈中从入栈到出栈的过程。

下面的这段程序,肯定有一个main线程来执行main()方法里面的代码,方法内部我们通常会定义一些局部变量,比如manager,JVM中必须有一块区域来保存方法中的这些数据,这个就是Java虚拟机栈,Java虚拟机栈是 线程私有 的。

    public class Kafka {public static void main(String[] args) {ReplicaManager manager = new ReplicaManager();manager.loadReplicaFromDisk();}}
    public class ReplicaManager {public static void loadReplicaFromDisk() {Boolean hashFinishedLoad = false;}}

比如main线程执行了main()方法,那么就会创建一个栈帧(里面存放manager局部变量),并将其压入main线程自己的Java虚拟机栈中,如下图:

然后main线程继续执行loadReplicaFromDisk方法,遇到方法内部的hashFinishedLoad局部变量,就会再创建一个栈帧,压入自己的虚拟机栈中:

上述就是JVM中的”Java虚拟机栈“这个组件的作用: 调用任何方法时,为方法创建栈帧然后入栈,栈帧里存放了这个方法对应的局部变量之类的数据(也包括方法执行的其它相关信息),方法执行完毕后就出栈。

五、Java堆内存

Java堆内存,这是JVM内存区域中最重要的一块区域,存放着各种Java对象,是线程共享区域。

下面代码中,new ReplicaManager()创建了一个对象实例,这个对象实例的相关信息就存放在Java堆内存中:

    public class Kafka {public static void main(String[] args) {ReplicaManager manager = new ReplicaManager();manager.loadReplicaFromDisk();}}

main线程在执行main()方法时,会为其创建一个栈帧并入栈,栈帧中的局部变量manager存放着ReplicaManager对象实例在Java堆内存中的地址:

六、本地方法栈

本地方法栈,其作用和Java虚拟机栈类似,区别在于本地方法栈是为虚拟机所使用到的 Native方法 服务,而Java虚拟机栈为虚拟机执行Java方法(也就是字节码)服务。本地方法栈也是线程私有的。

JDK中的很多底层API,比如IO、NIO、网络等,如果大家去看它的源码,会发现很多地方是调用的native修饰的方法,比如下面这样:

    public native int hashCode();

在调用native方法时,也会有线程对应的栈来保存native方法底层用到的局部变量表之类的信息,这就是本地方法栈的作用。

七、总结

本章,我们通过代码的执行流程讲解了JVM的内存模型,读者需要重点关注方法区、程序计数器、Java虚拟机栈、Java堆内存与程序执行逻辑的关系,其中Java堆内存是我们后面章节要关注的重点区域。

相关文章:

JVM基础(2)——JVM内存模型

一、简介 JVM会加载类到内存中,所以 JVM 中必然会有一块内存区域来存放我们写的那些类。Java中有类对象、普通对象、本地变量、方法信息等等各种对象信息,所以JVM会对内存区域进行划分: JDK1.8及以后,上图中的方法区变成了Metasp…...

使用 Process Explorer 和 Windbg 排查软件线程堵塞问题

目录 1、问题说明 2、线程堵塞的可能原因分析 3、使用Windbg和Process Explorer确定线程中发生了死循环 4、根据Windbg中显示的函数调用堆栈去查看源码,找到问题 4.1、在Windbg定位发生死循环的函数的方法 4.2、在Windbg中查看变量的值去辅助分析 4.3、是循环…...

做科技类的展台3d模型用什么材质比较好---模大狮模型网

对于科技类展台3D模型,以下是几种常用的材质选择: 金属材质:金属材质常用于科技展台的现代感设计,如不锈钢、铝合金或镀铬材质。金属材质可以赋予展台一个科技感和高档感,同时还可以反射光线,增加模型的真实…...

EasyExcel简单实例(未完待续)

EasyExcel简单实例 准备工作场景一:读取 Student 表需求1:简单读取需求2:读取到异常信息时不中断需求3:读取所有的sheet工作表需求4:读取指定的sheet工作表需求5:从指定的行开始读取 场景二:写入…...

ROS2学习笔记一:安装及测试

目录 前言 1 ROS2安装与卸载 1.1 安装虚拟机 1.2 ROS2 humble安装 2 ROS2测试 2.1 topic测试 2.2 小海龟测试 2.3 RQT可视化 2.4 占用空间 前言 ROS2的前身是ROS,ROS即机器人操作系统(Robot Operating System),ROS为了“提高机器人…...

Xcode14.3.1真机调试iOS17的方法

Hello,大家好我是咕噜铁蛋!Xcode 是苹果官方开发工具,它提供了完整的开发环境和工具集,支持开发 iOS、macOS、watchOS 和 tvOS 应用程序。对于 iOS 开发者来说,Xcode 是必备的工具之一。而随着 iOS 系统的不断更新和升…...

主流大语言模型从预训练到微调的技术原理

引言 本文设计的内容主要包含以下几个方面: 比较 LLaMA、ChatGLM、Falcon 等大语言模型的细节:tokenizer、位置编码、Layer Normalization、激活函数等。大语言模型的分布式训练技术:数据并行、张量模型并行、流水线并行、3D 并行、零冗余优…...

Linux中vim查看文件某内容

一、编辑文件命令 [rootyinheqilin ~]# vim test.txt 1,在编辑的文件中连续按2次键盘的【g】键,光标会移动到文档开头第一行 2,输入一个大写 G,光标会跳转到文件的最后一行第一列(末行) 二、查看文件内容命令 gre…...

阿里云提示服务器ip暴露该怎么办?-速盾网络(sudun)

当阿里云提示服务器IP暴露的时候,这意味着您的服务器可能面临安全风险,因为黑客可以通过知道服务器的IP地址来尝试入侵您的系统。在这种情况下,您应该立即采取措施来保护您的服务器和数据。以下是一些建议: 更改服务器IP地址&…...

IP地址的网络安全防护和预防

网络安全对于保护个人和组织的信息资产至关重要,而IP地址是网络通信的基础。在这篇文章中,IP数据云将探讨IP地址的网络安全防护和预防措施,以确保网络的安全性和可靠性。 IP地址是互联网上每个设备在网络中的唯一标识符。有IPv4和IPv6两种类…...

数据挖掘在制造业中的预测与优化应用

随着大数据时代的到来,数据挖掘技术在各行各业的应用日益广泛,尤其在制造业中,其对于提升生产效率、降低运营成本、优化供应链管理等方面发挥着不可替代的作用。本文将探讨数据挖掘在制造业中的预测与优化应用,通过深入剖析实际案…...

Java面试之并发篇(一)

1、前言 本篇主要总结JAVA面试中关于并发相关的高频面试题。本篇的面试题基于网络整理,和自己编辑。在不断的完善补充哦。 2、简述程序、进程、线程、的基本概念? 2.1、程序 程序,是含有指令和数据的文件,被存储在磁盘或其他的…...

分布式全局id

分布式全局id snowflake 算法是 twitter 开源的分布式 id 生成算法,采用 Scala 语言实现,是把一个 64 位的 long 型的 id,1 个 bit 是不用的,用其中的 41 bits 作为毫秒数,用 10 bits 作为工作机器 id,12 …...

springboot 房屋租赁系统

spring boot mysql mybatis 前台后端...

TypeScript接口、对象

目录 1、TypeScript 接口 1.1、实例 1.2、联合类型和接口 1.3、接口和数组 1.4、接口和继承 1.5、单继承实例 1.6、多继承实例 2、TypeScript 对象 2.2、对象实例 2.3、TypeScript类型模板 2.4、鸭子类型(Duck typing) 1、TypeScript 接口 接口…...

Flask 菜品管理

common/libs/Helper.py getDictFilterField() 方法 用于在web/templates/food/index.html中展示菜品分类 如何能够通过food里面的cat_id获取分类信息呢?只能通过for循环,这样会很麻烦,所以定义了这个方法。 这个方法可以的查询返回结果…...

亚马逊实时 AI 编程助手 CodeWhisperer使用体验

文章目录 1:什么是CodeWhisperer ?2:试用3:上手体验 1:什么是CodeWhisperer ? 最近ChatGPT展现出强大AI能力给我们带来了深刻的影响,AI现在不是一个概念,基于AI的产品一定在各行各业…...

[机缘参悟-123] :实修 - 东西方各种思想流派实修的要旨与比较?

目录 前言: 一、东方各种思想流派实修的要旨? 1.1 儒、释、道、法的主要思想 1.2 儒、释、道、法各种追求的目标 1.3 儒、释、道、法各自修行的法门或修行的途径 二、西方灵修的各种派别的要旨? 2.0 西方灵修的各种派别 2.1 玛雅星系…...

基于51单片机的数字时钟系统设计

标题:基于51单片机的数字时钟系统设计与实现 摘要: 本文详细介绍了基于STC89C51单片机设计一款具有精确计时功能的数字时钟系统的全过程。该系统利用了单片机内部的定时器/计数器资源,结合液晶显示屏和按键输入模块,实现了时间显…...

《每天十分钟》-红宝书第4版-基本引用类型

引用值(或者对象)是某个特定引用类型的实例。在 ECMAScript 中,引用类型是把数据和功能组织到一起的结构,经常被人错误地称作“类”。虽然从技术上JavaScript 是一门面向对象语言,但ECMAScript 缺少传统的面向对象编程…...

别再乱用缓动了!Tween动画效果选择指南与性能优化技巧

别再乱用缓动了!Tween动画效果选择指南与性能优化技巧 在数字界面设计中,动画效果如同烹饪中的调味料——用对了能提升整体体验,用错了反而让人不适。作为前端开发者和UI设计师,我们常常陷入一个误区:认为只要加了动画…...

AI破界:2026消费创新爆发:AI助手一句话下单1.2亿次背后的商业变局

2026年,AI不再是实验室里的参数竞赛,而是嵌入了日常消费的每一处褶皱。从"AI助手一句话下单超1.2亿次"到"AI眼镜实时投射导航信息",从"大模型折叠进咖啡取单口令"到"具身智能机器人持证上岗"——AI消…...

【ROS】利用moveit控制自制机械臂(0)

利用moveit控制自制机械臂: 1. 建立机械臂的urdf文件(或xacro文件)【ROS】利用moveit控制自制机械臂(1)——建立机械臂的urdf文件-CSDN博客 2. 使用moveit配置助手生成配置文件 【ROS】利用moveit控制自制机械臂&…...

WiFi卡片生成工具终极指南:10个技巧加速第三方资源加载与使用

WiFi卡片生成工具终极指南:10个技巧加速第三方资源加载与使用 【免费下载链接】wifi-card 📶 Print a QR code for connecting to your WiFi (wificard.io) 项目地址: https://gitcode.com/gh_mirrors/wi/wifi-card WiFi Card是一个开源项目&…...

Clawdbot汉化版企业微信入口:5分钟快速部署,打造本地AI助手

Clawdbot汉化版企业微信入口:5分钟快速部署,打造本地AI助手 1. 为什么选择Clawdbot汉化版 1.1 本地化AI助手的核心优势 Clawdbot汉化版是一款完全运行在本地的AI助手解决方案,与常见的云端AI服务相比具有三大独特优势: 数据零…...

GLM-OCR镜像免配置优势:预装py310+torch2.9.1+transformers5.0.1.dev0

GLM-OCR镜像免配置优势:预装py310torch2.9.1transformers5.0.1.dev0 1. 开篇:为什么选择预配置镜像 如果你曾经尝试过从零搭建深度学习环境,一定体会过那种"依赖地狱"的痛苦。各种库版本不兼容、CUDA配置问题、环境冲突...往往花…...

黑丝空姐-造相Z-Turbo镜像体验:一键启动,专注创意而非配置

黑丝空姐-造相Z-Turbo镜像体验:一键启动,专注创意而非配置 1. 镜像概述与核心价值 1.1 什么是黑丝空姐-造相Z-Turbo 黑丝空姐-造相Z-Turbo是一款基于Xinference部署的专业文生图模型服务镜像,专为生成特定风格的视觉内容而优化。该镜像采用…...

SAP STMS传输管理系统详解:如何高效管理跨环境请求传输

SAP STMS传输管理系统高级实战:构建企业级跨环境传输体系 在SAP系统实施与运维过程中,传输管理系统(STMS)如同连接各环境的神经网络,其效率直接影响着企业IT系统的敏捷性和稳定性。对于每天需要处理数十甚至上百个传输请求的大型企业而言&…...

Hunyuan-MT-7B惊艳表现:技术标准文档中英文术语映射一致性

Hunyuan-MT-7B惊艳表现:技术标准文档中英文术语映射一致性 1. 项目背景与模型介绍 Hunyuan-MT-7B是腾讯混元团队在2025年9月开源的多语言翻译模型,这个70亿参数的"小而美"模型在翻译领域展现出了令人惊艳的性能表现。 核心优势一览&#xf…...

深入解析PCIE数据链路层:DL_Active与DL_UP状态机制及其应用

1. PCIe数据链路层基础概念 PCIe(Peripheral Component Interconnect Express)作为现代计算机系统中最重要的高速串行总线标准之一,其架构采用分层设计理念。数据链路层(Data Link Layer)作为承上启下的关键层级&#…...