一张图看懂JVM
JVM是什么
jvm是Java虚拟机,是一种虚构的计算机。目的是为了能够在各类计算机上通过构建jvm来运行java代码。
JVM模型
- 栈:线程栈,内部放局部变量
- 堆:
栈
首先,栈其实就是线程。内部主要存放局部变量。
栈帧结构
栈帧:栈内的存放单元,线程内的每个方法对应一个栈帧,栈帧内存放着方法的局部变量
这里的方法调用就是栈的方式,调用某方法则某方法的栈帧入栈,调用结束后出栈
操作数栈:操作的调用的栈
方法出口:调用时记录着当该方法调用结束时,应该执行之前方法的哪行代码
程序计数器
程序计数器是一个记录着当前线程所执行的字节码的行号指示器。
每运行完一行代码,都会修改当前数值
堆
用来存放对象,每new一个对象,那么对象实际上就保存在我们的堆呢,并且赋值会使栈内存在对象地址,从而形成一个引用关系
分代现象
- Eden(生成区):新生成的对象都存放在这里,当Eden满后,会触发Minor GC机制,存活下来的对象移动到Survivor0区,Survivor0区满后触发执行Minor GC,Survivor0区存活对象移动到Suvivor1区,这样保证了一段时间内总有一个survivor区为空。经过多次Minor GC仍然存活的对象移动到老年代。
- Survivor区:由FromSpace和ToSpace组成。
- 老年代:存储长期存活的对象,占满时会触发Major GC=Full GC,GC期间会停止所有线程等待GC完成,所以对响应要求高的应用尽量减少发生Major GC,避免响应超时。
- Minor GC : 清理年轻代
- Major GC : 清理老年代
- Full GC : 清理整个堆空间,包括年轻代和永久代
所有GC都会停止应用所有线程。
堆与栈的关系
方法区
用来存放常量、静态变量、类信息
本地方法栈
本地方法(基本淘汰):有 native 修饰,会调用操作系统底层的c语言代码
在java语言出现初期,为了兼容老系统既C语言的代码,则出现了本地方法,来通过本地方法调用老版本的c语言方法。
本地方法的调用就存放于本地方法
点击查看:图片源文件地址