智能垃圾收集?

ano*_*non 3 java garbage-collection stability

您可以通过调用简单地在Java中进行垃圾收集,System.gc()但有时这会"拖延"应用程序.像这样垃圾收集并避免失速是一个坏主意:

new Thread(new Runnable() {
   public void run() { 
      System.gc(); 
   }
}).start();
Run Code Online (Sandbox Code Playgroud)

或者这可能导致更多问题?

hay*_*lem 15

第一件事:不要明确地打电话给GC

除非你有充分的理由.即使你认为你这样做,你可能也没有.

GC知道它在做什么(大部分时间......)

如果你继续阅读,我假设你有一个非常好的(虽然可能是扭曲的)理由试图搞砸GC,尽管它很可能比你决定什么时候收集它要聪明得多记忆.另外,请记住,通过明确地调用它,你会混淆它并搞砸它的启发式,所以它变得不像以前那么聪明.所有这些都是因为你试图超越它.

GC并不总是关心你所说的

如果你这样做了很充分的理由,或者在你真的想确保你下手的最佳存储状态可能密集的代码段的情况下,你需要知道这可能会无法正常工作:调用System.gc()不保证正如其Javadoc (强调我的)所提到那样进行垃圾收集:

调用gc方法表明 Java虚拟机花费了很多精力来回收未使用的对象.

其他建议

追捕并杀死(坏)显式GC

  • 打开-XX:+DisableExplicitGC(如果您的JVM支持它)以防止那些疯狂的呼叫造成任何伤害(在评论中归功于Fredrik)
  • 看看你最喜欢的IDE,或者grep调用它System.gc()和它的等价物并摆脱它们.

寻找另一种方式

请参阅Grooveek的答案,了解其他有用的建议(比如使用WeakReferences).

尝试使用其他GC并为您的应用程序微调您的VM

根据您的使用情况,也许尝试其他GC实现可能会有所帮助:CMC,G1,ParallelGC等...如果您想避免"失速",我在G1中引入了非常好的结果,因为它在最新的Java SE中引入自Java 7发布以来的6次更新,运行密集型企业应用程序以实现长时间运行.

请注意,JVM调优是一项非常复杂的工作.

进一步阅读

您可以浏览这些以获取更多详细信息:

*谨慎使用:有时不是最新的,不记录所有内容,并列出了许多实验性功能或仅限HotSpot的功能.

  • 有人会认为,如果你要全押,你会拼写检查.我猜不会. (2认同)
  • @Stefan Kendall:有人会认为语言学习者会给出非英语母语者编辑答案的时间.但感谢指出我的错误,无论多好:) (2认同)
  • @MarceloHernándezRishmawy:是的,我看到了那个,并且认为"呐喊"......甚至在你的评论出现之前纠正了它:)公平地说,Stefan的评论是完全有效的,因为我应该在点击提交之前进行拼写检查(而且我'我甚至会为他+1),但我经常喜欢在非常短的时间内编辑我的答案,以便我可以通过小的迭代来改进它. (2认同)