1.JDK框架图

JVM课堂小结

2.JVM屏蔽不同OS在底层硬件与指令上的区别

JVM课堂小结

3.Java虚拟机结构

  • 图中橙色区域:线程共享区域
  • 图中紫色区域:线程私有区域

JVM课堂小结

4.Java代码与对应的JVM指令

  • 程序的方法调用与栈结构契合
  • 一个方法对应一块栈帧内存区域
  • javap -c xxx.class > xxx.txt(字节码反汇编)
  • JVM指令手册

JVM课堂小结JVM课堂小结

5.JVM结构作用与关系

  • 每个线程都有自己的内存空间
  • 程序计数器:当前执行代码的位置(行号)
  • 本地方法栈:native方法(C语言等实现的方法,如线程Thread的start()方法)
  • 操作数栈:简单来说,JVM执行引擎的一个工作区,当一个方法被调用的时候,一个新的栈帧也会随之被创建出来,但这个时候栈帧中的操作数栈却是空的,只有方法在执行的过程中,才会有各种各样的字节码指令往操作数栈中执行入栈和出栈操作。

JVM课堂小结

6.JVM堆区结构

  • 年轻代:老年代 = 1:2(默认)
  • Eden:Survivor(From:To) = 8:1:1(默认)

JVM课堂小结

7.可达性算法分析

  • GC Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等。
  • 将“GC Roots”对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象。

JVM课堂小结

8.Object对象头

  • 分代年龄为15的对象进入老年代。

JVM课堂小结

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线程–>用户程序卡顿问题)。

JVM课堂小结

10.案例图解

JVM课堂小结JVM课堂小结

11.案例调优

  • Java调优的目的:减少GC的次数,减少STW的时间,减少STW的发生概率。

JVM课堂小结

相关文章: