使用-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区的这些对象就会被回收了。
|