JVM(学习总结)
2025-05-19 19:02:10 0 举报
**JVM学习总结** JVM(Java虚拟机)是Java平台的核心,负责执行Java字节码。它以操作系统独立性著称,使得Java成为跨平台的语言。JVM工作主要分为加载、链接、初始化、使用、卸载五个阶段。在此过程中,类加载器(ClassLoader)扮演着关键角色,它将.class文件加载到内存,并进行字节码验证。 JVM内存区域被划分为程序计数器、Java虚拟机栈、本地方法栈、堆和方法区。其中,堆用于存储对象实例,是垃圾回收的主要区域。JVM还定义了多种垃圾收集算法,如标记-清除、复制、标记-整理和分代收集算法,以及垃圾收集器如Serial、Parallel、CMS和G1等,用于优化内存的使用和提升应用性能。 最后,JVM提供了与硬件平台无关的执行环境,但这也意味着其性能可能低于直接运行在操作系统上的本地代码。了解JVM能够帮助开发者编写性能更优的Java程序,并有效诊断和解决内存溢出等问题。
作者其他创作
大纲/内容
执行引擎(Execution Engine)
堆内存(可以通过JVM的配置参数调整)
堆Heap
student 3
栈
实例A
2
方法区
幸存1区(to)
常量池
student 3(地址为 0x0001)age:20name:李四
输入输出参数
sing()、构造函数
使用:1
子帧的地址
new Person();
本地方法库
person(引用)
Student Class
(程序)C
伊甸园(Eden Space)
现在这些小的内存空间连续了就可以尽可能的充分利用内存空间
堆
student 1
伊甸园区(eden)
trst()
栈帧:main()
sing()方法结束后,会弹栈,main()结束弹栈
类加载器(Class Loader)
实例化 new
Stack(桶模型)
UserDemo Class(模板类)
Class File
方法区Method Area
永久区/元空间(方法区)
(程序)A
硬件系统
实例C
实例Z
1
方法调用
Student.class
每个小长方形代表存在堆里面的实例
(程序)D
养老区(ParOldGen)
栈帧
student2 0x0002
清楚没有标记的对象
幸存区0区(from)
实例B
具体原理:在每次进行Minor GC时,实际上只有一个幸存区用于接收从Eden区以及另一个幸存区复制过来的新存活对象。具体来说:在一次GC周期中,假设当前的“To”区是空的或者是上一个GC周期中的“From”区,那么这个“To”区将用于存放此次GC中新发现的存活对象。“From”区指的是当前存放有上次GC后留下的存活对象的那个幸存区。在这次GC过程中,“From”区中的存活对象会被评估并复制到“To”区或者如果它们已经经历过了一定数量的GC周期(默认:15次GC),则可能直接晋升到老年代(Old Generation)。
使用:2
标记压缩算法
局部变量表
JVM(虚拟机)
本地方法接口(Native Inference)
从main()方法开始执行
这些虚线的矩形:代表一个空间,这个空间只能放比这个空间小的实例,可能这个内存空间就浪费了
student的实例
student 2
使用:0次
调用者栈帧指针
方法索引
父帧的地址
使用:1次
new Person
5
Class Loader
实例的引用地址
局部变量
标记清除算法
这三个是没有垃圾产生的
Java栈Stack
养老区
.java
getClassLoader
from区与to区是轮换的,谁空谁是to
get.class
main()
(程序)B
JVM调优的区域:堆(方法区是堆的一部分)
引用计数法
本地方法栈Native Method Stack
student3 0x0001
新生区(占的内存大小可以通过参数调节)
运行时数据区(Runtime Data Area)
程序计数器
加载,初始化
3
student 1(地址为 0x0003)age:18name:张三
永久存储区
。。。。。
4
栈里面是不可能存在垃圾的,原因如下:栈内存是线程私有的内存区域,每个线程在创建时都会分配一个独立的栈空间。栈的主要作用是存储方法调用时的栈帧,每个方法调用都会在栈中压入一个栈帧,方法执行完毕后该栈帧会自动弹出,所以不需要垃圾回收机制main()方法先进入栈,main()调用的方法,都会按照先进后出的原则,一旦方法执行完毕,立刻弹出栈
引用计数法(清除实例C)
class file
运行流程
赋值
幸存区1区(to)
幸存0区(from)
0 条评论
下一页