JVM组成部分

深入理解JVM:内存结构与调优

前言

JVM(Java Virtual Machine的简称。意为Java虚拟机。)。指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。
JVM的组成部分主要包括5部分:
在这里插入图片描述

1.JVM内存划分

1.1堆

所有创建的对象信息都放在这个区域,堆也是JVM中最大的一部分。是线程共享的。
在这里插入图片描述
1.新生代:
新创建的对象会存放在新生代,经历了一定次数的GC(垃圾回收)之后,依然存活下来的数据,会移动至老年代(HotSpot的默认回收次数是15次)
2.老年代:
经历了一定次数还存活的对象以及大对象
3.新生代又分为3个部分:
Eden,ServivorFrom、ServivorTo三个区

4.为什么大对象直接存放到老年代?
答:因为大对象创建和消耗的时间比较多,性能比较低,如果放到新生代,可能需要频繁的创建和销毁对象,导致JVM运行效率降低。

5.为什么要进行堆分代?
答:分代的理由就是为了优化GC性能,如果没有分代,那么我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样会对堆的所有区域进行扫描。而我们的很多对象都是朝生暮死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先对新生代的区域进行回收,这样可以提高效率。

1.2Java虚拟机栈

Java虚拟机栈是线程私有
在这里插入图片描述
布局变量表:存放方法参数和局部变量(8大基本数据类型)
操作栈:每个方法会生成一个先进后出的操作栈
动态链接:指向运行时常量池方法的引用
方法返回地址:PC寄存器的地址

1.3本地方法栈

本地方法栈和JVM栈类似,只不过JVM栈是为字节码服务的,而本地方法栈是为本地方法服务的,本地方法栈是线程私有的

1.4程序计数器

记录线程执行的行号,线程私有

1.5方法区

1.JDK7时 叫做方法区,也叫永久代
方法区主要存储被虚拟机加载的类型信息、常量、静态变量。(字符串常量池移至堆中)

2.JDK8时 叫做元空间
废除永久代的概念,元空间存储在本地内存中,将JDK7中永久代剩余的内容(主要是类型信息)全部移至元空间中。

2.线程私有还是公有

1.线程私有:
本地方法栈,Java虚拟机栈,程序计数器
2.线程共有:
堆,方法区

3.JVM调优

JVM参数调优
(1)-Xmx10m 堆最大容量
(2)-Xms10m 堆最小容量的设置
(3)通常情况下可以将Xmx和Xms的大小设置相同,这样可以防止堆扩容造成抖动

<think>嗯,用户想了解JVM的主要组成部分。我之前回答过类似的问题,但需要结合用户提供的引用内容。引用[1]提到JVM由5部分组成,包括内存划分中的堆。引用[2]则补充了类加载器、字节码校验等运行机制。用户可能正在学习JVM架构或解决相关问题,比如内存溢出或类加载问题。 首先,我需要整理JVM的主要组件。通常,JVM分为类加载子系统、运行时数据区、执行引擎、本地方法接口和本地方法库。运行时数据区又包括堆、方法区、虚拟机栈、本地方法栈和程序计数器。但根据用户提供的引用,引用[1]提到5部分,其中堆是内存划分的一部分,而引用[2]强调了类加载过程和字节码校验。可能用户引用的资料分类方式不同,需要将两者结合起来。 要确保回答覆盖用户提到的内容,同时补充其他关键部分。比如,引用[1]中的堆是内存区域的一部分,而运行时数据区还包括其他部分。类加载子系统对应引用[2]中的类加载器。执行引擎和本地方法接口可能没有被引用提到,但它们是标准组成部分,需要包括进去。 另外,用户可能关心这些组件如何协同工作。比如类加载器加载类后,数据存储在运行时数据区,执行引擎处理字节码。同时,垃圾回收发生在堆内存,这也是性能调优的重点。 需要检查是否有遗漏的部分,比如JIT编译器属于执行引擎的一部分。还要注意引用中的“字节码校验”属于类加载过程中的验证阶段,应归类到类加载子系统中。 最后,生成相关问题时,要考虑用户可能的后续需求,如内存管理、类加载机制、垃圾回收算法等。确保问题能引导用户深入学习各个组件。</think>### JVM的主要组成部分解析 JVMJava虚拟机)的架构设计包含以下核心组件,这些组件协同工作以实现Java程序的跨平台运行和高效管理: --- #### 1. **类加载子系统(Class Loader Subsystem)** 负责加载字节码文件(`.class`)到内存中,包含三个阶段: - **加载**:查找并读取类文件。 - **链接**:验证字节码合法性(*字节码校验*[^2])、为静态变量分配内存、解析符号引用。 - **初始化**:执行静态代码块和变量赋值。 类加载器分为: - 启动类加载器(Bootstrap Class Loader) - 扩展类加载器(Extension Class Loader) - 应用程序类加载器(Application Class Loader) - 自定义类加载器(用户定义) --- #### 2. **运行时数据区(Runtime Data Areas)** JVM内存的核心划分[^1],包括: - **堆(Heap)**:存储对象实例和数组,是垃圾回收的主要区域。 - **方法区(Method Area)**:存储类结构(如常量池、字段、方法代码)。 - **虚拟机栈(JVM Stack)**:保存方法调用栈帧(局部变量、操作数栈)。 - **本地方法栈(Native Method Stack)**:支持Native方法(如C/C++代码)。 - **程序计数器(Program Counter Register)**:记录当前线程执行位置。 --- #### 3. **执行引擎(Execution Engine)** 负责解释或编译字节码为机器指令: - **解释器**:逐行解释执行字节码。 - **即时编译器(JIT Compiler)**:将热点代码编译为本地机器码。 - **垃圾回收器(GC)**:自动回收堆内存中的无效对象。 --- #### 4. **本地方法接口(JNI, Java Native Interface)** 提供Java调用操作系统本地方法(如C/C++库)的桥梁。 --- #### 5. **本地方法库(Native Libraries)** 包含操作系统或第三方提供的本地库文件,通过JNI调用。 --- ### 组件协同示例 1. 程序启动时,**类加载器**加载`Main.class`到方法区。 2. **执行引擎**解释`main()`方法的字节码,在虚拟机栈中创建栈帧。 3. 创建对象时,对象实例存储在**堆**中。 4. **垃圾回收器**定期清理无引用的对象释放内存。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值