调用`System.gc()`是一种在Java应用程序中管理内存的好方法吗?

时间:2010-08-23 15:38:20

标签: java garbage-collection

我有一个想要调用system.gc()的java应用程序。释放记忆是一种合理的方法吗?或任何其他建议?真的很感激!

8 个答案:

答案 0 :(得分:12)

停止引用变量。您不需要自己调用System#gc()。如果JVM位于OutOfMemoryError的边缘, 肯定会运行GC。

如果停止引用变量不是一个选项,因为确实需要它们,那么您需要对应用程序进行概要分析以修复/清除任何内存泄漏和/或在启动时为JVM提供更多内存。

答案 1 :(得分:5)

在Java中,没有必要显式调用垃圾回收。它由虚拟机自动完成。

答案 2 :(得分:4)

请勿致电System.gc()。不必要地运行垃圾收集器是破坏程序性能的好方法。 JVM会在需要时收集垃圾。

Java平台的一大优势是成功的自动垃圾收集。使用它。

答案 3 :(得分:3)

只有在非常具体的情况下,经过严格的剖析证明后,明确调用gc()才是一个好主意。它应该永远不会产生功能差异,但在非常特定的情况下它可能会感知性能提升。

例如,假设您正在使用Java制作视频游戏,并且每隔几分钟您就会在各个级别之间休息。这可能是一个显式调用垃圾收集器的好地方,如果它在播放下一级别时可能会降低GC周期发生的可能性(这可能会破坏游戏玩法)。

简而言之,它应该保留在最需要GC时比运行时更好的时候,并且只有在严格的分析证明其包含的情况下才能使用它。

答案 4 :(得分:1)

Java Head First Java表示每个变量(实例或局部变量)都有一个范围,当范围丢失时,变量就不再存在了,在谈论对象时它说一个对象是垃圾收集器可读的当他的最后一次现场参考消失时。

答案 5 :(得分:1)

System.gc()将开始Full Collection,如果您关心暂停时间并使用并发或G1收集器,这将特别糟糕。

除非你已经找出了一个特定的原因,即你需要不同的行为,否则你不应该玩垃圾收集......你更有可能会损害性能,而不是看到任何收益。

答案 6 :(得分:0)

软&弱引用是一种很好的方法来保存你想要存储在内存中的数据,但是如果内存变得紧张则可以不用。

正常引用很强,即当某人拥有对它的强引用时,对象不会被最终确定或被垃圾收集。如果对某个对象持有一个SoftReference,该对象可能会在OutOfMemory情况下保留在内存中,直到它将被自动刷新。 WeakReference可能随时刷新,但在持有对象节省一些磁盘开销的情况下它可能仍然有用。

由于这些特性,引用非常适合缓存数据,而不必担心在内存开始变紧的情况下必须刷新数据。

创建引用的最简单方法是这样的:

Reference<MyClass> r = new SoftReference<MyClass>(new MyClass())

现在你传递参考。当您想要获取对象时,请调用Reference.get()

MyClass myClass = r.get();
if (myClass != null) {
  // do something
}
else {
  // Oh dear class isn't there, go to plan b
}

答案 7 :(得分:-1)

使用gc(),您只需对JRE说它应该调用垃圾收集器。有时候这个建议很有用,但在大多数情况下,设置所有对null的引用都是正确的方法。