秋招之路7:全面JVM
jvm全景图
其中蓝色区域是线程独有的,黄色区域是线程共享的
分析方法
javap 命令 javap -c 可以对代码进行反汇编
里面的各种指令,可以用jvm指令手册一个一个查
一个线程的全景图
程序计数器:和计组一样,是存放下一条指令所在单元的地址的地方。
栈帧:一个方法对应一块栈帧内存区域。放自己方法里面各种变量用的。
其中局部变量表一般是放局部变量。操作数栈,一般是放操作过程中的常量。
局部变量表中的对象,存的是对象的地址,对象数据存在堆空间中。
动态链接:将符号引用转换为直接引用。
本地方法栈:一般是本地的native方法。
堆
堆内存回收图
流程:
当Eden区满了后,GC收集Eden区,没有被收集的对象,分代年龄+1,进入From区;
下一次Eden区满后,GC收集Eden区和From区,没有被收集的对象,分代年龄+1,进入To区;
下一次Eden区满后,GC收集Eden区和To区,没有被收集的对象,分代年龄+1,进入From区;
...
直到有分代年龄为15的对象,进入到老年代。
当老年代满了后,开始Full GC[比较耗时].
分析内存情况的工具
jvisualvm:jdk自带的一个工具,然后可以安一个visual GC的插件。
名词
GC:垃圾收集器
Minor GC:新生代GC,指发生在新生代的垃圾收集动作,所有的Minor GC都会触发全世界的暂停(stop-the-world),停止应用程序的线程,不过这个过程非常短暂。
Major GC/Full GC:老年代GC,对整个堆进行垃圾收集
可达性分析算法
算法的基本思想:通过一系列的称之为“GC ROOTs”的对象作为起点,从这些起点开始向下搜索。
找到的对象都标记为非垃圾对象;其余对象标记为垃圾对象。
GC ROOTs根节点:线程栈的本地变量,静态变量,本地方法栈的变量等等。
jvm调优
主要调优在堆上,也有部分调优在方法区
目的:减少full GC的次数,减少每次full GC的执行时间。
需要
各种场景分析,具体垃圾收集器,垃圾收集算法进行分析。