为什么在java中的垃圾收集中发生这种情况

时间:2013-08-08 04:16:42

标签: java swing garbage-collection concept

据我所知,当我使用System.gc()方法运行垃圾收集时,它将从堆中收集所有未使用和未销毁的对象并进行清理。所以当我运行System.gc();应该增加JVM的内存。但是当我运行它时,在下面的代码中,结果让我感到困惑。

Runtime rs = Runtime.getRuntime();
System.out.println("Free memory in JVM before Garbage Collection = " + 
                   rs.freeMemory());
rs.gc();
System.out.println("Free memory in JVM after Garbage Collection = " +
                   rs.freeMemory());

输出

Free memory in JVM before Garbage Collection = 12184624
Free memory in JVM after Garbage Collection = 12184360    

看前值大于后值。

如果我的错误概念或解释我为何会发生这种情况,请纠正我。

谢谢。

5 个答案:

答案 0 :(得分:6)

在Java中调用垃圾收集仅仅是对JVM的建议。从技术上来说,收集垃圾的方式是100%无法控制的。调用System.gc()礼貌地建议应该删除垃圾,但Java完全有权忽视你,就像一个不听话的孩子一样。

虽然它会按照你的要求通常行事,但它并不总是如此,你肯定不能依赖它。

答案 1 :(得分:1)

除了System.gc()请求之外,垃圾收集在系统认为合适时自动完成。无法保证在请求时可以释放任何内存。

答案 2 :(得分:1)

Runtime.gc()更多的是暗示GC要花费一些额外的精力来释放内存,并且在实践中可能实际上没有释放任何内容,但是你的空闲内存的惊人降低值可能非常好而不是因为Runtime.freeMemory没有给出准确的结果;

  

返回:
  近似到当前可用于未来分配对象的内存总量,以字节为单位。

换句话说,它不是一个确切的数字,即使没有释放存储器内容,GC也可以很好地改善近似值。

答案 3 :(得分:0)

来自Javadocs,

public void gc()
  

运行垃圾收集器。调用此方法表明Java虚拟机花费了大量精力来回收未使用的对象,以使其当前占用的内存可用于快速重用。当控制从方法调用返回时,虚拟机已尽最大努力回收所有丢弃的对象。   名称gc代表“垃圾收集器”。即使未明确调用gc方法,虚拟机也会在单独的线程中根据需要自动执行此回收过程。

     

方法System.gc()是调用此方法的常规方便方法。

gc在你调用它时不会清理,但它会将它添加到JVM的队列中,如果需要,JVM会这样做,否则会被忽略。

答案 4 :(得分:0)

  

您作为Java程序员不能强制Java中的垃圾收集。通过   调用System.gc(),它只会在JVM认为需要时触发   基于Java堆大小的垃圾收集。有像这样的方法   System.gc()和Runtime.gc()用于发送垃圾请求   集合到JVM,它在内部使用标记和扫描算法   确定哪些对象不再使用且需要收集   作为垃圾,但不能保证垃圾收集会发生   就在您调用System.gc()或Runtime.gc()时。此外,它还取决于在您调用System.gc()或Runtime.gc()时是否有一些符合垃圾收集条件的对象,如果不是这样,则不会影响调用System.gc()或Runtime.gc。 ()那一刻。

来源:(你可以在这里阅读更多内容)

http://javarevisited.blogspot.in/2011/04/garbage-collection-in-java.html

http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html