Minor GC、Major GC、与Full GC
程序员文章站
2022-03-02 22:08:50
...
前言
JVM 在进行 GC 时, 并非每次都对 新生代,老年代,方法区 区域一起回收的,大部分时候回收的都是指的新生代
针对于 Hotspot VM的实现,它里面的GC按照回收区域又可以分为俩大类型
一、部分收集(Partial GC)
新生代收集(Minor GC / Young GC): 只是新生代的垃圾收集
老年代收集(Mijor GC / O1d GC): 只是老年代的垃圾收集
1> 目前 只有CMS GC 会有单独收集老年代的行为
2> 注意,很多时候Major GC 会和 Full GC 混淆使用,需要具体分辨是老年代回收还是整堆回收
混合收集(Mixed GC) : 收集整个新生代 和 部分老年代的行为
1> 注意 只有 G1 GC 会有这种行为
年轻代GC 触发机制
1> 当年轻代空间不足时,就会触发Minor GC , 这里的年轻代满指的是Eden区满。
survivor 满不会引发GC。(每次Minor GC会清理年轻代的内存)
2>因为Java对象大多都具备朝生夕死的特性,所以Minor GC 非常频繁,一般回收的速度也较快
3>Minor GC 会引发STW(Stop-The-World),暂停其他用户的线程,等待垃圾回收的结束,用户线程才会恢复
老年代(Major GC / Full GC)触发机制
1> 指发生在老年代的GC,对象从老年代消失时, Major GC 或 Full GC 发生了
2> 出现了Major GC 通常会伴随着至少一次的Mijor GC (并非绝对,在 Parallel Scavenge 收集器的收集策略
就有直接进行Major GC 的策略选择过程)
也就是在老年代空间不足时,会先尝试触发Minor GC,如果之后空间还不足,则触发 Major GC
3> Major GC 的速度一般在Minor GC慢十倍以上,STW时间更长
4> 如果Major GC 后还内存不足,就报OOM
二、整堆收集(Full GC)
收集整个Java堆和方法区的垃圾收集
Full GC 触发机制
1> 调用 System.gc() 时,系统建议执行Full GC 但不必然执行
2> 老年代空间不足
3> 方法区空间不足
4> 通过Minor GC 后进入老年代的大小大于老年代的可用内存
5> 由Eden区,Survivor Space 0 区向 Survivor Space 1 区复制时。对象大于Space 1 的可用内存。则把该对象转存到老年代
且老年代的可用内存小于该对象大小
示例
public class GCTest {
public static void main(String[] args) {
// 设置参数 -Xms10m -Xmx10m -XX:+PrintGCDetails
int i = 0;
try {
List<String> list = new ArrayList<>();
// 字符串常量池 存放在 堆空间
String str = "I have a dream";
while (true){
list.add(str);
str = str + str;
i ++;
}
} catch (Exception e) {
e.printStackTrace();
// java.lang.OutOfMemoryError: Java heap space
System.out.println("遍历次数为" + i);
}
/**
* [PSYoungGen: 2048K->509K(2560K)] 2048 回收前的大小。509K 回收后大小 。2560K 总空间 ; ParOldGen: 6643K->6335K(7168K) 老年代
* [GC (Allocation Failure) [PSYoungGen: 2048K->509K(2560K)] 2048K->920K(9728K), 0.0048122 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
* [GC (Allocation Failure) [PSYoungGen: 2495K->492K(2560K)] 2906K->1418K(9728K), 0.0018940 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
* [GC (Allocation Failure) [PSYoungGen: 2457K->492K(2560K)] 3384K->2258K(9728K), 0.0022835 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
* [GC (Allocation Failure) [PSYoungGen: 1890K->492K(2560K)] 3656K->3154K(9728K), 0.0015207 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
* [Full GC (Ergonomics) [PSYoungGen: 2357K->0K(2560K)] [ParOldGen: 6246K->4851K(7168K)] 8604K->4851K(9728K), [Metaspace: 3556K->3556K(1056768K)], 0.0064825 secs] [Times: user=0.11 sys=0.00, real=0.01 secs]
* [GC (Allocation Failure) --[PSYoungGen: 1872K->1872K(2560K)] 6724K->8516K(9728K), 0.0011662 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
* [Full GC (Ergonomics) [PSYoungGen: 1872K->0K(2560K)] [ParOldGen: 6643K->6643K(7168K)] 8516K->6643K(9728K), [Metaspace: 3557K->3557K(1056768K)], 0.0046095 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
* [GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] 6643K->6643K(9728K), 0.0005279 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
* [Full GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] [ParOldGen: 6643K->6335K(7168K)] 6643K->6335K(9728K), [Metaspace: 3557K->3557K(1056768K)], 0.0107313 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
*
* 在OOM前经历的Full GC Failure 失败
*/
}
}
总结
Major GC 与 Full GC 是调优中主要 要进行调优的GC
Full GC 是开发或调优中尽量要避免的, 这样暂停的时间会短些
上一篇: 面试总结-----基础篇
下一篇: Full GC