Chinaunix首页 | 论坛 | 博客
  • 博客访问: 94624
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 191
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-18 16:33
个人简介

有二事焉,恒然于心,敬之畏之,日省日甚!外乎者如璀璨星穹,内在者犹道德律令。

文章分类

全部博文(11)

文章存档

2017年(7)

2014年(2)

2013年(2)

我的朋友

分类: Java

2014-03-11 16:12:32

代码如下:
public static void main(String[] args) 
{
    byte[] obj1 = new byte[1024 * 1024 * 10];
    obj1 = null;
    byte[] obj2 = new byte[1024 * 1024 * 10];
    byte[] obj3 = new byte[1024 * 1024 * 20];
    obj3 = null;
    byte[] obj4 = new byte[1024 * 1024 * 20];
}

该代码的作用就是分别触发了一次Monior GC(也叫Young GC)和Full GC。然后用JVM参数:-XX:+PrintGCDetails打印出详细情况。


采用:
java -Xmx50m -Xms50m -Xmn15m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:PretenureSizeThreshold=20971520 mem.Main

java -Xmx50m -Xms50m -Xmn15m -XX:+PrintGCDetails -XX:+UseParNewGC -XX:PretenureSizeThreshold=20971520 mem.Main
这两组参数分别运行。其中,有-XX:+UseSerialGC的是Serial收集器;有-XX:+UseParNewGC的是ParNew收集器。-XX:PretenureSizeThreshold参数的意思是说凡是大于20971520B(20MB)的对象将不分配在年轻代而会直接进入老年代(注意该参数只对Serial和ParNew这两个收集器有效!

运行完毕后的结果如下:

java -Xmx50m -Xms50m -Xmn15m -XX:+PrintGCDetails 
-XX:+UseSerialGC -XX:PretenureSizeThreshold=20971520 mem.Main
Minor GC:
---------------------
[GC [DefNew: 11033K->467K(13824K), 0.0494602 secs] 11033K->467K(49664K), 0.0496940 secs[Times: user=0.00 sys=0.00, real=0.05 secs]

Full GC:
---------------------
[GC [Tenured: 20480K->10707K(35840K), 0.0087202 secs] 31679K->10707K(49664K), [Perm : 2578K->2578K(21248K)], 0.0096461 secs[Times: user=0.01 sys=0.00, real=0.01 secs]



java -Xmx50m -Xms50m -Xmn15m -XX:+PrintGCDetails -XX:+UseParNewGC -XX:PretenureSizeThreshold=20971520 mem.Main
Minor GC:
---------------------
[GC [ParNew: 11033K->489K(13824K), 0.0645998 secs] 11033K->489K(49664K), 0.0649839 secs[Times: user=0.00 sys=0.00, real=0.07 secs]

Full GC:
---------------------
[GC [Tenured: 20480K->10707K(35840K), 0.0092875 secs] 31701K->10707K(49664K), [Perm : 2578K->2578K(21248K)], 0.0101704 secs[Times: user=0.00 sys=0.00, real=0.01 secs]

从上面的日志比较可以看出,Minor GC的时候,Serial收集器输出了DefNew来表示新生代的收集情况;而ParNew输出了ParNew来表示新生代的收集情况。另外,当发生Full GC的时候两者则是完全一模一样的(具体的收集数据和耗费时间当然是不一样的)。这点可以用于以后的日志分析中。当然读者也可以自己试试例如Parallel Scavenge收集器的情况。

PS:要注意到收集器一般是组合式使用的。如下图(这个图片引用自周志明先生的《深入理解Java虚拟机:JVM高级特性与最佳实践》中3.4节,P55):

只有两个有连线的收集器才能放在一起使用。
而JVM参数中对于垃圾收集起的指定是一个参数可能同时指定了2个收集器的组合,例如(这个图片引用自周志明先生的《深入理解Java虚拟机:JVM高级特性与最佳实践》中表3-1,P65):












阅读(4782) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~