我有一个想要调用system.gc()的java应用程序。释放记忆是一种合理的方法吗?或任何其他建议?真的很感激!
答案 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)
答案 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的引用都是正确的方法。