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

调用'System.gc()`是在Java应用程序中管理内存的好方法吗?,java,garbage-collection,Java,Garbage Collection,我有一个java应用程序想要调用system.gc()。这是释放内存的合理方法吗?或者其他建议?真的很感激 停止引用变量即可。您不需要自己调用System#gc()。如果JVM处于OutOfMemoryError的边缘,它肯定会运行GC 如果停止引用变量不是一个选项,因为您确实需要它们,那么您需要分析您的应用程序以修复/清除任何内存泄漏和/或在启动时为JVM提供更多内存。对于gc(),您只需对JRE说它应该调用垃圾收集器。有时候这个建议很有用,但在大多数情况下,将所有引用设置为null是正确的方

我有一个java应用程序想要调用system.gc()。这是释放内存的合理方法吗?或者其他建议?真的很感激

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


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

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

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

第一个Java的书头说,每个变量(实例或局部变量)都有一个作用域,当作用域丢失时,变量就不存在了,当谈到对象时,它表示当垃圾收集器的最后一个活动引用消失时,该对象可供垃圾收集器使用。

不要调用
System.gc()
。不必要地运行垃圾收集器会破坏程序的性能。JVM将在需要时收集垃圾


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

软引用和弱引用是一种保存数据的好方法,您希望这些数据保存在内存中,但如果内存紧张,则可以不使用这些数据

普通引用是强引用,即当有人持有对对象的强引用时,对象不会被最终确定或垃圾收集。如果您持有对某个对象的软引用,则该对象很可能会保留在内存中,直到出现内存不足的情况时才会自动刷新。WeakReference可能随时被刷新,但在保存对象可以节省一些磁盘开销的情况下,它仍然很有用

由于这些特性,引用非常适合缓存数据,而无需担心在内存开始紧张时必须刷新数据

创建引用的最简单方法如下:

Reference<MyClass> r = new SoftReference<MyClass>(new MyClass())
System.gc()将开始完全收集,如果您关心暂停时间并且正在使用并发或G1收集器,这一点尤其糟糕


除非你已经分离出一个特定的原因,你需要不同的行为,你不应该玩垃圾收集。。。只有在非常特定的情况下,并且经过严格的评测证明后,才有可能显式调用
gc()
。它永远不会产生功能上的差异,但在非常特定的场景下,它可能会感知到性能提升

例如,假设您正在用Java制作一个视频游戏,每隔几分钟您就会在两个级别之间出现一次中断。这可能被证明是显式调用垃圾收集器的好地方,如果它减少了在玩下一个关卡时发生GC循环的可能性(这可能会破坏游戏性)


简言之,它应该保留在您比运行时更了解GC最需要的时候,同样,只有在经过严格的分析证明其包含的合理性后才能使用。

看看类似的问题:,,等等,等等。我很少看到有人使用
system.GC()
还要注意调用system.GC()不保证垃圾收集器将运行。这只是一个请求,可能会被尊重,也可能不会被尊重。由于调用
gc()
是一种可怕的做法,实际上有一个系统属性可以设置为忽略调用。除非MyClass扩展布尔值,否则这不是真正有效的表示法:)这是正确的,但该书不是规范性参考。您应该引用JLS或JVM规范。在大多数情况下,让引用超出范围是正确的方法。这不是Javadoc中所说的。如果在任何地方都有关于它开始全面收集的声明,我20年来从未见过它
System.gc()
可以执行任何操作,也可以不执行任何操作。
MyClass myClass = r.get();
if (myClass != null) {
  // do something
}
else {
  // Oh dear class isn't there, go to plan b
}