使用-XX:+PrintTenuringDistribution的详细输出和visual GC的疑问

chainhou 2013-06-08
最近在学习jvm内存管理的相关知识的时候看到了这个帖子http://hllvm.group.iteye.com/group/topic/34882,R大回复使用-XX:+PrintTenuringDistribution得到更详细的GC输出,我在自己机器上测试,例子使用帖子内的
public class GCDemo {
	/**
	 * -Xms20m -Xmx20m -Xmn10m -XX:+UseSerialGC -XX:SurvivorRatio=3 -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution
	 */
    public static void main(String[] args) throws Exception{

        byte[] bytes1 = new byte[1024*1024*2];
        byte[] bytes2 = new byte[1024*1024*1];
        byte[] bytes3 = new byte[1024*512];
        bytes1 = null;
        byte[] bytes4 = new byte[1024*1024*3];
       
        byte[] bytes5 = new byte[1024*1024];
        bytes2 = null;
        bytes4 = null;
        byte[] bytes6 = new byte[1024*1024*2];
       
    }
}


为了更详细的输出加上了-XX:+PrintHeapAtGC,输出有如下片断:
[GC [DefNew
Desired survivor size 1048576 bytes, new threshold 1 (max 15)
- age   1:    1731096 bytes,    1731096 total
: 3968K->1690K(8192K), 0.0032981 secs] 3968K->1690K(18432K), 0.0033325 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap after GC invocations=1 (full 0):

这其中“Desired survivor size 1048576 bytes, new threshold 1”这句是说survivor区需要1048576 bytes吗?在第二次GC的时候输出也还是一样,
Desired survivor size 1048576 bytes, new threshold 1 (max 15)
- age   1:    1048592 bytes,    1048592 total
: 5851K->1024K(8192K), 0.0023364 secs] 5851K->1690K(18432K), 0.0023698 secs] [Times: user=0.02 sys=0.00, 

不知道这个Desired survivor size 1048576 bytes怎么理解?输出中的age是表示当前对象的年龄吧?不知道哪里有关于这些的说明,google了一把没找到
另外,打算使用Visual GC,一边debug,一边观察内存,但在debug过程中,即使我停在断点处,Visual GC的堆内各个区也在不断变化,这是什么情况呢?有没有可以使其只根据当关程序变化,不受其它因素影响的方式?
junedo 2013-06-09
引用
不知道这个Desired survivor size 1048576 bytes怎么理解?输出中的age是表示当前对象的年龄吧?

说说我的理解,这句话表示当前线程向survivor 区申请1048576 的空间,触发了gc条件导致了gc;
new threshold 1 (max 15):表示当前从eden晋升到old区的阈值;
- age 1  1048592 bytes,    1048592 total :表示的当前eden区的对象的age;

如果回答有错,请各位指正。

引用
打算使用Visual GC,一边debug,一边观察内存,但在debug过程中,即使我停在断点处,Visual GC的堆内各个区也在不断变化,这是什么情况呢?有没有可以使其只根据当关程序变化,不受其它因素影响的方式?

虽然你停在了断点处,表示你加断点的线程被阻塞了,但是jvisualvm和你进程交互的jmx线程和其他线程在运行,所以会导致内存不断变化;
如果你只起一个主线程并加断点,应该就不会受其他因素影响;
chainhou 2013-06-20
最近又看了一些资料,大概明白这个Desired survivor size 1048576 bytes表示Survivor区的50%大小,如果超过这个大小,threshold自动变为1,下次GC的时候,Survivor区的这些对象就会被回收了。
Global site tag (gtag.js) - Google Analytics