显式调用System.gc()?

sgo*_*les 15 java garbage-collection daemon

据说我们不能garbage collection在java中强制进程.
毕竟,它是一个守护程序线程.

但有时候,为什么我们System.gc( );明确地调用函数?
值得一试吗?任何Pro和Con的?
如果在许多情况下没用,为什么不从Java中弃用此方法?

PS:用例子说明会很有用

Chr*_*son 9

在我看来,最好的System.gc()方法是将该方法视为VM的"提示",即垃圾收集应该运行.也就是说,就像很多人认为他们正在表现的"优化"一样,通常最好让系统自己处理事情.系统正在发展等等,还有一些实例,开发人员可能实际上知道更好,它的用例可能非常类似于为什么一些代码仍然用汇编编写(大多数时候,编译器更好) ,但在少数情况下 - 或者与少数开发人员 - 人类实际上可以编写更有效的代码).

我在过去看到的一个例子就是为了证明它的存在,如果分配了大量的对象,并且你作为开发人员知道它们不再被使用的瞬间.在这种情况下,您可能有比GC更多的内存利用率信息(或者至少在它实现之前),并且由于回收的内存量很大,因此建议它运行是有意义的.


biz*_*lop 8

你回答了一半问题:值得吗?不,因为你不能强迫它.

运行垃圾收集器.调用此方法表明Java虚拟机花费了大量精力来回收未使用的对象,以使其当前占用的内存可用于快速重用.

这几乎是EULA-英语,"你可以尝试,但我们都知道结果".:)

此外,应用程序服务器可以(通常会)使用-XX:-DisableExplicitGC命令行选项禁用它.

那么重点是什么呢?好吧,可能有一个:一些应用程序喜欢显示堆上可用的可用内存量,在刷新显示System.gc();之前,在它之前调用它可能是适度的.


Jus*_*ner 7

问:为什么我们称之为System.gc(); 功能明确?

答:因为有人写错了代码.

我想大多数人会同意你不应该System.gc()明确地打电话.

让系统按照预期管理内存.任何依赖于性能的代码都很可能被破坏.另外,请记住JVM可以完全忽略您的请求.

如果您想了解更多信息,我建议您阅读以下答案:

java - 为什么调用System.gc是一个坏习惯?