【问题标题】:Tenured Generation Garbage Collection终身垃圾回收
【发布时间】: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 永远不会被清除(直到满,就我而言)。

所以我的问题是:

  1. Garbage Collector 如何为 Tenured Generation 堆工作?
  2. 如果我想强制内存的GC 以防止不可预知的未来Heapissues,我该怎么办?

【问题讨论】:

  • 这是一个相当广泛的问题,答案会根据您使用的 GC 算法而变化。您可能想玩一下 G1 收藏家,它根本没有 eden 和 tenured 空间。
  • 您的问题有点离题,但它可能有助于问题背后的意图。你是否能够打破内部类的引用,也许是通过使用静态类并将它需要的任何数据传递给它的构造函数?
  • @ChrisK 我的可运行inner class 的所有实例都将更新outer class 的一些计数。这些实例由ThreadPoolExecutor 控制(或说使用),该ThreadPoolExecutor 在具有大队列容量的外部类实例中。那么,有什么建议吗?
  • @ChrisK 关于垃圾收集器,我没有学到那么多。这都是 JVM 的默认配置。

标签: java garbage-collection jvm


【解决方案1】:

垃圾收集器如何在 Tenured Generation Heap 中工作?

嗯,和你描述的差不多。在需要空间(或可能很快需要空间)之前,什么都不会发生,此时会触发主要 GC。我想这是预期的行为——不希望停止世界暂停触发的频率超过应有的频率。

如果我想强制对内存进行 GC 以防止未来发生不可预测的堆问题,我该怎么办?

从技术上讲,你不能。 GC 会在任何时候触发,无论您给出什么提示。如果你想建议运行时执行一次 GC,你可以使用System.gc(),但同样,这只是一个建议——运行时可以随意忽略它。不过,据我所知,System.gc() 电话往往会受到关注。

【讨论】:

  • 谢谢,调用 System.gc() 安全吗?
  • @ROROROOROROR 如果“安全”是指“不会使系统崩溃”,我会假设是这样,除非您在某处有一些不稳定的终结器和/或 GC 开销不会触发异常/错误。换句话说,是的,在大多数情况下调用System.gc() 是安全的。请注意,根据this SO question,这不一定是推荐的做法。
猜你喜欢
  • 2011-12-21
  • 2012-01-28
  • 2013-06-27
  • 2011-11-29
  • 2021-12-20
  • 2011-07-15
  • 2014-03-09
  • 2013-06-10
  • 2010-11-05
相关资源
最近更新 更多