java - 永久代总是在 HotSpot VM 上连续收集吗?

标签 java garbage-collection jvm-hotspot

来自阅读a rather mature Oracle blog entry ,我了解到

(...) the permanent generation is currently collected serially.

然而,这篇博文是几年前的文章了,我想知道最近垃圾收集算法的进步可能会如何改变这种说法的准确性。我特别想知道新的 G1 垃圾收集器 desribed by Oracle与:

The older garbage collectors (serial, parallel, CMS) all structure the heap into three sections: young generation, old generation, and permanent generation of a fixed memory size. (...) When performing garbage collections, G1 operates in a manner similar to the CMS collector.

但在整个教程中再也没有提到永久代。

通过阅读有关 CMS 的文章——根据上述声明,它的工作方式类似于 G1——我也没有找到任何关于永久代的明确信息,但从中了解到 other blog entry那个

(...) the Concurrent Mark and Sweep does not compact at all. Once objects cannot be allocated anymore a serial major GC is triggered.

所以我想知道现代垃圾收集器(例如 CMS 或 G1)是否完全忽略永久代并将其留给 full GC 调用运行旧的串行 GC 来清除永久代(虽然这个串行 GC 也连续收集年轻一代和成熟一代,但我认为在使用 G1 而不是 CMS 时这是不可取的)。我主要感兴趣的是找出在 STW 和收集时间方面对永久代执行垃圾收集是否比收集永久代更昂贵。

奖励问题:Oracle 教程提到永久代是堆的一部分。我一直认为永久代是在堆外显式分配的。这在最近的 HotSpot 实现中有变化吗?

感谢您的帮助!

最佳答案

有一个JEP156关于让 G1 能够在没有完整 GC 的情况下卸载类,但是依赖部分指出 等待 [ JEP122 是有意义的] 直到永久代消失,使 JEP156 更容易实现。

所以看起来这个问题可能在 Java 8 中确实得到了解决,但不仅仅是由于元空间,而是因为元空间被作为对类进行增量 GC 的先决条件。

这是我的理解。

编辑:在过去的几天里,我一直在听一些今年的 JavaOne session ,幸运的是我今天才找到一个关于 PermGen removal 的 session 。这说明了一切:

  • HotSpot 目前需要完整的 GC 来收集 PermGen
  • 即使在引入元空间之后,这仍然是正确的
  • 最后的摘要幻灯片似乎证实了 JEP156 仍在计划中(但她没有谈论它)
  • 它甚至回答了我有答案但没有来源的奖励问题:是的,PermGen 在堆中

关于java - 永久代总是在 HotSpot VM 上连续收集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20453322/

相关文章:

java - 如何绘制比设备分辨率更大的 GLSurfaceView 分辨率?

java - AutoCloseable 与垃圾回收的关系

c# - 空引用类型变量会影响垃圾收集器 (GC) 性能吗?

php - 我可以信任调用 PHP __destruct() 方法吗?

java - 为什么 Hotspot JIT 不为长计数器执行循环展开?

java - ImageIO.readImage IIOException 虽然我可以在 Chrome 中打开它

java - 使用 Java 将文件从一个目录 move 到另一个目录

Haskell:ST/GC 泄漏内存未收集?

java - 奇怪的分配和字符串连接优化代码的一些描述

assembly - vmovdqu在这里做什么?