3

据我所知,当我使用 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    

看到前值大于后值。

如果我的概念有误,请纠正我或向我解释为什么会发生这种情况。

谢谢你。

4

5 回答 5

6

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

尽管它通常会按照您的要求执行,但并非总是如此,您当然不能依赖它。

于 2013-08-08T04:17:47.513 回答
1

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

于 2013-08-08T04:21:36.740 回答
1

Runtime.gc()更多的是暗示 GC 花费一些额外的精力来释放内存,实际上可能不会在实践中释放任何内存,但是您令人惊讶的空闲内存值下降很可能是因为Runtime.freeMemory没有给出准确的结果;

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

换句话说,它不是一个确切的数字,即使没有释放内存内容,GC 分析内存内容也可能会改善近似值。

于 2013-08-08T04:31:43.480 回答
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

于 2013-08-08T04:37:43.483 回答
0

从 Javadocs,

public void gc()

运行垃圾收集器。调用此方法表明 Java 虚拟机将努力回收未使用的对象,以使它们当前占用的内存可用于快速重用。当控制从方法调用返回时,虚拟机已尽最大努力回收所有丢弃的对象。gc 这个名字代表“垃圾收集器”。虚拟机根据需要在单独的线程中自动执行此回收过程,即使gc没有显式调用该方法。

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

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

于 2013-08-08T04:24:58.710 回答