显式调用 System.gc( )?

2022-09-03 05:25:32

据说我们不能在java中强制垃圾回收过程。
毕竟,它是一个守护进程线程。

但有时,为什么我们显式调用函数?
值得称它吗?任何优点和缺点?
如果在许多情况下没有用,为什么Java不推荐使用此方法?System.gc( );

PS :用例子解释会很有用


答案 1

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

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


答案 2

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

运行垃圾回收器。调用此方法表明 Java 虚拟机花费精力来回收未使用的对象,以便使它们当前占用的内存可供快速重用。

这几乎是EULA-English,意思是“你可以尝试,但我们都知道结果”。:)

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

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