然后使用之前的JVM参数来跑一下上面的程序,可以看到下面的GC日志
上面的代码中,首先分配了3个2MB的数组,然后最后让array1变量指向了第三个2MB数组
接着创建了一个128K的数组,但是确让array2指向了null,同时我们一直都知道,Eden区里会有500KB左右的未知对象
接着会创建一个2MB的数组被array3引用
此时eden区肯定是放不下这2MB的数组的,因为只有8MB,已经占了6MB多,将近7MB的内存了,肯定是容不下最后一个数组的,所以此时必然触发一次Young GC。
YGC回收的是前两个2MB的数组,一共4MB的内存容量,还有那个128KB的array2所指的对象
先看如下日志:ParNew: 7260K->573K(9216K), 0.0024098 secs。
此时内存里还剩下array1所指的2MB的数组,那这怎么剩下了573KB了呢?
其实道理很简单,大家可以想一下,这次GC的时候,会回收掉上图中的2个2MB的数组和1个128KB的数组,然后留下 一个2MB的数组和1个未知的500KB的对象
年轻代的垃圾回收是要往survivor区挪的
所以在这里并不是让2MB的数组和500KB的未知对象都进入老年代,而是把500KB的未知对象放入From Survivor区中!
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!