欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 是开发或调优中尽量要避免的, 这样暂停的时间会短些
相关标签: jvm

上一篇: 面试总结-----基础篇

下一篇: Full GC