1.JDK框架图
2.JVM屏蔽不同OS在底层硬件与指令上的区别
3.Java虚拟机结构
- 图中橙色区域:线程共享区域
- 图中紫色区域:线程私有区域
4.Java代码与对应的JVM指令
- 程序的方法调用与栈结构契合
- 一个方法对应一块栈帧内存区域
- javap -c xxx.class > xxx.txt(字节码反汇编)
- JVM指令手册
5.JVM结构作用与关系
- 每个线程都有自己的内存空间
- 程序计数器:当前执行代码的位置(行号)
- 本地方法栈:native方法(C语言等实现的方法,如线程Thread的start()方法)
- 操作数栈:简单来说,JVM执行引擎的一个工作区,当一个方法被调用的时候,一个新的栈帧也会随之被创建出来,但这个时候栈帧中的操作数栈却是空的,只有方法在执行的过程中,才会有各种各样的字节码指令往操作数栈中执行入栈和出栈操作。
6.JVM堆区结构
- 年轻代:老年代 = 1:2(默认)
- Eden:Survivor(From:To) = 8:1:1(默认)
7.可达性算法分析
- GC Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等。
- 将“GC Roots”对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象。
8.Object对象头
- 分代年龄为15的对象进入老年代。
9.Visaul GC动态图
- minor GC(清理年轻代)、full GC(清理年轻代+老年代)、堆区中(Eden、Survivor(s)、Old)、元空间(方法区)的内存动态变化情况。
- jdk > bin > jvisualvm.exe(打开方式)
- jvisualvm安装visual GC插件
- Eden区满,minor gc;老年代区满,full gc。
- Eden–>From–>To–>Old
- 如果老年代满,对象仍被引用,full gc无法回收,此时,对象继续增加就会造成OOM(内存溢出)。
- STW:Stop The World(full gc会出现:停止所有用户线程,专心执行GC线程–>用户程序卡顿问题)。
10.案例图解
11.案例调优
- Java调优的目的:减少GC的次数,减少STW的时间,减少STW的发生概率。