今天下午本来在划水,突然看到微信联系人那一个红点点,看了下,应该是博客园的朋友。加了后,这位朋友问了我一个问题:
问我,这两块有什么关系? 看到这段 gc 日志,一瞬间脑子还有点懵,嗯,这个可能要翻下书了,周志明的 Java 虚拟机那本神书里面有讲,我果断地打开了 pdf,找了起来,很快,找到了:
上面发的那个图里,6762k 就是 新生代 gc 前的容量,1006k 就是新生代 gc 后的容量,9216k就是新生代的10m中(8m的eden区+1m的 from survivor区)的大小。
再看后面的那几个数字,6762K-》3455K (19456K),意思就是,GC前,Java堆使用了 6762K,GC后,Java堆使用了 3455K,而19456K就是整个堆的容量(新生代9m+老年代10m)。
按理说,这么解释就足够了,但是,眼尖,他提出了下面的问题(大概意思是这个,我自己配的字):
这他么就尴尬了。。。怎么都解释不通了啊。。。书上怕不是错了啊。。。经过我们一番研究,得出一致结论:
网上搜了下,感觉都是些理论,感觉大家都没问题,就我有问题???想起之前看虎扑帖子,有人发帖说浙江很富,没有穷人(确实富),有浙江网友回复:浙江就我一个穷人!
我现在就是那个感觉,大家都没问题,就我有问题??
当然,如果我就此止步了,也就不会写这个了,我和那位朋友捣鼓了一下,还是理解清楚了 gc 日志。
二、gc 日志 的正确阅读方法
找这位朋友拿了他的测试代码,很简单的demo,如下:
1 import java.util.concurrent.TimeUnit; 2 3 4 public class AllocationTest { 5 6 public static final int _1MB = 1024 * 1024; 7 8 9 public static void main(String[] args) throws InterruptedException { 10 byte[] allocation1, allocation2, allocation3, allocation4; 11 12 allocation1 = new byte[2 * _1MB]; 13 allocation2 = new byte[2 * _1MB]; 14 allocation3 = new byte[2 * _1MB]; 15 //触发Minor GC 16 allocation4 = new byte[4 * _1MB]; 17 } 18 }