Java 为什么?完全gc发生在两次次要gc之前?

Java 为什么?完全gc发生在两次次要gc之前?,java,java-8,garbage-collection,Java,Java 8,Garbage Collection,JDK1.8 public class Test1 { public static final int _1MB = 1024 * 1024; public static void main(String agrs[]) { gc(); System.out.println("hello world"); } private static void gc() { byte[] bytes

JDK1.8

public class Test1 {

    public static final int _1MB = 1024 * 1024;

    public static void main(String agrs[]) {
            gc();
            System.out.println("hello world");
    }

    private static void gc() {
            byte[] bytes = new byte[3*_1MB];
            byte[] bytes1 = new byte[_1MB];
            bytes = null;
            byte[] bytes2 = new byte[18*_1MB];
    }
}
输出:

-Xms25M -Xmx25M -XX:NewRatio=4 -XX:MaxTenuringThreshold=1 -XX:+UseParallelOldGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

为什么要在两次次要垃圾收集之前进行完全垃圾收集?

垃圾收集的整个要点是进行大量次要垃圾收集,而很少进行主要垃圾收集。这是如何发生的当然是一个实现细节,但这里有许多关于stackoverflow的帖子,这些文章将提供一些线索


你所看到的是完全正常的,只是一个健康的垃圾收集过程的一部分

具体在哪里
PSYoungGen
Full GC
之前,我认为在Full GC之前应该只有一个次要GC,但实际上是两个次要GC。字节[]字节2=新字节[18*1MB];第行的代码生成一个次要GC,然后生成完整GC,那么您认为在完整GC之前应该只有一个次要GC?在这种情况下,你的想法是错误的,就这么简单
0.080: [GC (Allocation Failure) [PSYoungGen: 3677K->496K(4608K)] 3677K->3576K(26112K), 0.0031388 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 
0.084: [GC (Allocation Failure) [PSYoungGen: 1520K->0K(4608K)] 4600K->4416K(26112K), 0.0013931 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
0.085: [GC (Allocation Failure) [PSYoungGen: 0K->0K(4608K)] 4416K->4416K(26112K), 0.0009730 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
0.086: [Full GC (Allocation Failure) [PSYoungGen: 0K->0K(4608K)] [ParOldGen: 4416K->1298K(21504K)] 4416K->1298K(26112K), [Metaspace: 2635K->2635K(1056768K)], 0.0027873 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
hello world