JVM垃圾收集器如何清除 Tenured Generation ? 直到分配的堆大小已满或?
因为对于我的项目,我有一个ThreadPoolExecutor
,它提交了大量的任务。
由于这些runnable tasks
是由inner class
创建的,因此它们对外部实例有一定的引用。它们很容易在GC
Eden Space
中生存,最后传递到Tenured Generation
形式Survivor Space
。而且,通过Java Profiler监视JVM,我注意到这个Tenured Generation
永远不会被清除(直到完全,对于我的情况)。
所以我的问题是:
Garbage Collector
如何适用于Tenured Generation
堆?GC
内存以防止不可预测的未来Heap
问题,我该怎么办?答案 0 :(得分:1)
垃圾收集器如何为Tenured Generation Heap工作?
嗯,就像你描述的那样。在需要空间(或可能很快需要空间)之前没有任何事情发生,此时会触发主要的GC。我想这是预期的行为 - 不要让世界上的停顿更频繁地触发它们。
如果我想强制内存的GC来防止不可预测的未来堆问题,我该怎么办?
从技术上讲,你做不到。无论您提供任何提示,GC都会随时触发。如果你想建议运行时执行GC,你可以使用System.gc()
,但同样,这只是一个建议 - 如果需要,运行时可以自由地忽略它。从我所听到的情况来看,System.gc()
电话往往会被注意。