JVM 布局
JVM 构成
1,Java 虚拟机栈
帧栈 方法执行的内存模型(组成部分)
①:操作数栈
②:局部变量表
③:动态链接表
④:方法退出地址
运行过程:(简单理解,可以通过javap命令 帮字节码反编译为汇编语言,查看帧栈的操作过程)
①:每个方法的执行和返回,对应帧栈在JVM虚拟机栈中的入栈和出栈过程
②:方法的执行过程中涉及到数据计算过程 对应操作数栈的入栈和出栈,以及局部变量表的更新
2,Java native方法栈
上面的Java 虚拟机栈是操作Java 方法的,如果操作的是native 方法,那么对应的内存模型就是 native方法栈,其实执行的过程基本上和java 虚拟机栈大同小异。
3,程序计数器
JVM 怎么知道每个线程 当前应该执行到那个字节码指令,就是通过程序计算器来操作的。
4,堆
Java程序员经常接触的区域
Minor GC 流程 :1,new 对象以后会在Eden区域分配一块内存,Minor GC 以后,会将存活的对象copy到to区域 清空Eden和From区域
2,From对象和To对象角色互换 To变成From
3,再一次Minor GC 以后 Eden和From 区域 存活的对象 copy到 To 区域,清空Eden和From区域 ,From对象和To对象角色互换
QA: 为啥年轻代 需要有Survivor From和Suvivor To 2个区域,为啥不能合并成一个
答:如果只有1个,我们来模拟一次Minor GC 过程,首先需要标记Survivor 内存块中和Eden那些数据需要清除(标记-清除),清除过程需要一条一条清除,不能像上面的过程整个删除Survior From 内存块
GC 效率低下,其次,删除完以后,Survivor 内存空间极其分散,给一个稍微大一点的对象分配内存,都因为有可能木有连续的内存可以分配而进行一次Minor GC 进行内存回收
5,元空间/方法区
jdk8以前方法区称为永久代,意思就是垃圾回收器永远不会回收这一块(这一块内存主要存储 (class 对象,静态常量池,动态常量池)没啥可回收的,当然实际根据每个虚拟机的不同,会有不同的回收的策略哈,也有不回收的)),jdk8 以后元空间为堆外内存 啦,即在系统内存上直接分配。
6,常用工具
jps 列出JVM 虚拟机Java线程状况工具 ,使用方法 jps
jstack Java堆栈跟踪工具(线程快照)jstack -l pid >> path
jmap java 内存映射工具(堆内存快照)
jstat 虚拟机统计信息监控工具(GC 统计信息)