Java GC(仅做记录)

72 阅读2分钟

1 JVM结构

分类:

进程共享:方法区和堆区

线程共享:程序计数器、本地方法栈和虚拟方法栈

作用介绍:

  • 方法区:存储已被虚拟机加载的类信息、常量、静态变量等
  • 堆:堆是Java 虚拟机所管理的内存中最大的一块。唯一目的就是存放对象实例。在虚拟机栈中存放的只是引用,而引用指向的是堆中的对象。GC主要作用的区域
  • 虚拟机栈:局部变量表、操作数栈等。虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法返回地址等信息。
  • 本地方法栈:与虚拟机栈类似,是为native方法提供服务的。
  • 程序计数器:记录当前线程执行的方法执行到了第几行。如果线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是Natvie 方法,这个计数器值则为空(Undefined)。

2 Minor GC和Full GC

Minor GC一般时间很短,Full GC的速度一般会比Minior GC慢10倍以上,会影响到业务线程,所以要避免频繁的Full GC

  • Minor GC/Young FC:只是新生代的垃圾收集。
  • Full GC/Major GC:收集整个Java堆和方法区的垃圾。

3 Minor GC触发机制

  • 当新生代空间不足时,就会触发Minor GC,这里的新生代满指的是Eden代满,Survivor满不会引发GC(每次Minor GC会清理新生代的内存)。

年轻代分为三个区域——伊甸园(Eden Memory)和两个幸存区(Survivor Memory,被称为from/to或s0/s1),默认比例是8:1:1。

4 Full GC触发机制

  • 老年代空间不足:大对象直接进入老年代或者长期存活的对象进入老年代等导致老年代空间不足。
  • Minor GC时空间担保失败:使用复制算法的Minor GC需要老年代的内存空间做担保,担保失败会执行一次Full GC。

出现Full GC,通常也会伴随至少一次的Minor GC(非绝对)。