日期:2014-05-20  浏览次数:20613 次

请教一个内存回收问题

 public static void test(){
   {
     byte[] b =new byte[6*1024*1024];
   }
    System.gc();
    System.out.println("first explict gc over");
}

这段代码的GC过程如下:
[GC 271K->151K(5056K),0.0015089 secs]
[Full GC 151K->151K(5056K),0.0115487 secs]
[Full GC 7375k->(12284k),0.0097229 secs]
first explict gc over
哪位朋友能够看懂这段代码GC过程,还望不吝赐教,万分感激。

------解决方案--------------------
引用:
Quote: 引用:

没人的话,我来帮忙解释下吧,不详之处请勿见怪

首先,请加上-XX:+PrintGC -XX:+PrintGCDetails 用来显示gc的详细信息(显示新生代和永久代的细节)

然后得到更完整的输出:
[GC [PSYoungGen: 7496K->480K(38912K)] 7496K->6624K(125952K), 0.0049740 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
[Full GC [PSYoungGen: 480K->0K(38912K)] [ParOldGen: 6144K->6436K(87040K)] 6624K->6436K(125952K) [PSPermGen: 2561K->2560K(21504K)], 0.0089920 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] 
first explict gc over

[PSYoungGen: 7496K->480K(38912K)]: 新生代回收近7m内容,可以认为就是刚创建的byte数组给回收了。 




谢谢这位老兄的详细解答,这段代码是我在某本介绍虚拟机内存的书上看到的,没有详细介绍操作的过程。,但小弟仍然有一点点疑惑的地方,还望不闲麻烦赐教:
1,-XX:+PrintGC -XX:+PrintGCDetails是添加在哪的?什么时候添加?
2,PSYoungGen: 7496K->480K(38912K)]中“->”左边的7496K表示的是被GC回收的内存,那右边的480K呢?
还有,括弧中的(38912K)又是什么意思?
3, [Times: user=0.02 sys=0.00, real=0.01 secs] 中各个参数是什么含义呢?
谢谢!


1. -XX的都是JVM参数, 我在eclipse里面运行直接填在jvm args那个框里面就行了, 命令行运行的话,直接加在java 后面就行了,比如 java -jar xxx.jar -XX:+PrintGC -XX:+PrintGCDetails
2. 7496k是新生代回收前使用了多少空间,480k是回收后使用了多少空间,(38912K)是当前可用的总空间。
3. 里面都是垃圾回收使用的时间。看real就行了,这次垃圾回收用了0.01秒

------解决方案--------------------
不用关心这问题吧,如果效率影响不大,没用的自动就会回收,如果你特考虑效率可以自己选用回收器,主页上就有16%项目有用到,初学者还是先大体,后细节