最近在看深度理解java虚拟机,有大神能解释这么一段输出结果吗?

public class ReferenceCountingGC {

public Object instance = null;

private static final int _1MB = 1024 * 1024;

private byte[] bigSize = new byte[2 * _1MB];

public static void main(String[] args) {
    ReferenceCountingGC objA = new ReferenceCountingGC();
    ReferenceCountingGC objB = new ReferenceCountingGC();
    objA.instance = objB;
    objB.instance = objA;

    objA = null;
    objB = null;

    System.gc();
}

}

VM options参数:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8

输出结果:
[GC (Allocation Failure) [PSYoungGen: 7411K->1009K(9216K)] 7411K->3917K(19456K), 0.0017692 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (System.gc()) [PSYoungGen: 3302K->993K(9216K)] 6211K->3949K(19456K), 0.0005495 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (System.gc()) [PSYoungGen: 993K->0K(9216K)] [ParOldGen: 2956K->1780K(10240K)] 3949K->1780K(19456K), [Metaspace: 3233K->3233K(1056768K)], 0.0043093 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

疑问:
有大神能解析下这里面所有的内存kb具体是代表什么吗?与代码或虚拟机参数有没有什么联系?
比如说7411k->1009k,
又有7411k->3917k;
这些东西都是怎么算出来的?7411k具体又和什么有联系呢?

int类型数值范围是–32768到32767

这些数据都是在jvm发生GC操作时统计出来的数据。7411k->1009k,是指GC后 剩余的内容大小为 1009K。
PSYoungGen、ParOldGen、Metaspace就是他们多代表的类型。
分别表示了新生代,老年代,元空间(即之前的永久代概念)。
具体的运转逻辑比较复杂,就不展开了