【发布时间】:2014-07-09 16:16:57
【问题描述】:
Tenured Generation 是如何被 JVM 垃圾收集器清理的? 直到分配的堆大小已满或?
因为我的项目,我有一个ThreadPoolExecutor,它提交了大量的任务。
由于这些runnable tasks 是由inner class 创建的,因此它们对外部实例具有一定的引用。他们将很容易在Eden Space 中的GC 中存活下来,并最终传递给Tenured Generation 形式Survivor Space。而且,通过 Java Profiler 监控 JVM,我注意到这个 Tenured Generation 永远不会被清除(直到满,就我而言)。
所以我的问题是:
-
Garbage Collector如何为Tenured Generation堆工作? - 如果我想强制内存的
GC以防止不可预知的未来Heapissues,我该怎么办?
【问题讨论】:
-
这是一个相当广泛的问题,答案会根据您使用的 GC 算法而变化。您可能想玩一下 G1 收藏家,它根本没有 eden 和 tenured 空间。
-
您的问题有点离题,但它可能有助于问题背后的意图。你是否能够打破内部类的引用,也许是通过使用静态类并将它需要的任何数据传递给它的构造函数?
-
@ChrisK 我的可运行
inner class的所有实例都将更新outer class的一些计数。这些实例由ThreadPoolExecutor控制(或说使用),该ThreadPoolExecutor在具有大队列容量的外部类实例中。那么,有什么建议吗? -
@ChrisK 关于垃圾收集器,我没有学到那么多。这都是 JVM 的默认配置。
标签: java garbage-collection jvm