问一个JVM的问题,测试结果跟自己的理解有误

public class Test {  public static final int MB = 1024 * 1024;  public static void main(String[] args) throws InterruptedException {  byte[] a1 = new byte[2 * MB];  byte[] a2 = new byte[2 * MB];  byte[] a3 = new byte[2 * MB];  byte[] a4 = new byte[2 * MB];  }
}
参数设置: -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
结果如下:
[GC (Allocation Failure) [PSYoungGen: 7127K->648K(9216K)] 7127K->6800K(19456K), 0.0042678 secs] [Times: user=0.03 sys=0.02, real=0.00 secs]  [Full GC (Ergonomics) [PSYoungGen: 648K->0K(9216K)] [ParOldGen: 6152K->6670K(10240K)] 6800K->6670K(19456K), [Metaspace: 2594K->2594K(1056768K)], 0.0074118 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]  Heap  PSYoungGen      total 9216K, used 2130K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)   eden space 8192K, 26% used [0x00000000ff600000,0x00000000ff814930,0x00000000ffe00000)   from space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)   to   space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)  ParOldGen       total 10240K, used 6670K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)   object space 10240K, 65% used [0x00000000fec00000,0x00000000ff283bf8,0x00000000ff600000)  Metaspace       used 2600K, capacity 4486K, committed 4864K, reserved 1056768K   class space    used 288K, capacity 386K, committed 512K, reserved 1048576K

新生代采用的是 Parallel Scavenge,书上说是 标记复制算法
那么a1,a2,a3分配到了 Eden区,当分配a4的时候发觉Eden不够空间了,那么进行新生代GC,
那么新生代的对象就晋升到了老年代嘛,那么新生代完全足够容得下a4。 为何还要进行一次Full GC。


周志明老师的那本《深入理解Java虚拟机》第93页的那个实验,也没有发生Full GC。所以为啥呢?

ps. jdk版本为1.8
#测试#
全部评论
[ParOldGen: 6152K->6670K(10240K)] 这条的原因?老年代有空间占用了,minorgc要检查老年代的剩余空间决定要不要fullgc。
点赞 回复 分享
发布于 2018-07-21 18:31
牛客的代码排版好像出bug了
点赞 回复 分享
发布于 2018-07-21 17:56

相关推荐

不愿透露姓名的神秘牛友
06-29 17:30
找实习找着找着就要进入7月了,马上秋招也要开始了,找实习还有意义吗?
绝迹的星:有面就面, 没面上就当日薪4位数大佬免费培训, 面上了再考虑要不要实习
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务