是否有可能在Java中强制垃圾收集,即使这很棘手?我知道System.gc();和Runtime.gc ();但他们只建议做GC。如何强制GC?


当前回答

FYI

方法调用System.runFinalizersOnExit(true)保证终结器方法 在Java关闭之前调用。然而,这种方法本质上是不安全的 并且已经被弃用。另一种方法是在方法中添加“关机钩子” Runtime.addShutdownHook。

马萨拉特·西迪基

其他回答

最好的选择是调用System.gc(),这只是给垃圾收集器一个提示,表明您希望它进行收集。由于垃圾收集器是不确定的,因此没有办法强制和立即回收。

如果您正在使用JUnit和Spring,请尝试在每个测试类中添加以下内容:

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)

我想在这里补充一些东西。请不要说Java运行在虚拟机而不是实际的机器上。虚拟机有自己的与机器通信的方式。它可能因系统而异。现在,当我们调用GC时,我们要求Java虚拟机调用垃圾收集器。

由于垃圾收集器是与虚拟机一起使用的,我们不能强迫它当场进行清理。相反,我们将请求与垃圾收集器一起排队。这取决于虚拟机,在特定时间之后(这可能因系统而异,通常在分配给JVM的阈值内存已满时),实际机器将释放空间。: D

我想强制gc,因为当它发生时,我的代码被冻结了很长时间。其目的是通过定期引起gc来平滑充电。 所列出的解决方案在我的环境中并不强制。

So:

我请求内存临时变量, 简单地,通过增量, 并监视内存并在触发gc时立即停止操作。

它很容易工作,但你必须调整。

Runtime rt = Runtime. getruntime (); double usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024; if (usedMB > 1000) //只在必要时使用 { Byte [][] for_nothing = new Byte [10][]; For (int k = 0;K < 10;k + +) For_nothing [k] = new byte[100_000_000]; } system . gc (); .gc Runtime.getRuntime () (); .runFinalization Runtime.getRuntime () ();

FYI

方法调用System.runFinalizersOnExit(true)保证终结器方法 在Java关闭之前调用。然而,这种方法本质上是不安全的 并且已经被弃用。另一种方法是在方法中添加“关机钩子” Runtime.addShutdownHook。

马萨拉特·西迪基