perm gen 是堆的一部分吗?

Is perm gen part of heap?

我开始阅读有关 java、jvm 等的内容。但是当谈到 perm gen 内存时,我不断得到不同的答案。我真的不明白,而且越来越糊涂,因为有很多不同的解释。那么,perm gen 是堆的一部分还是不是?

首先,现代 JVM 没有 PermGen

PermGen 在 Java 8 中完全被放弃了。所以学习它真的没有什么意义。 Java 8 之前的所有 Java 版本都 生命周期结束 ,您应该早就迁移了您的代码。如果您在 Java 8 之前的 JVM 上的遗留应用程序中遇到 PermGen 问题,那是 另一个 移植它的原因1.

(Java 7 及更早版本)PermGen 被不同的人/来源描述为:

  • 一个单独的堆,或者
  • “堆”的单独区域。

根据您的观点,这两种描述都是正确的。不可争论的事实是:

  • PermGen 堆(或区域)的大小与“常规”堆的其余部分分开。因此,即使有常规堆 space 可用,PermGen space 也存在 运行 的风险。
  • PermGen 垃圾回收了……除了一两个例外。问题是它 很少 被垃圾收集,前提是 PermGen 中实际收集的垃圾最少。

PermGen 用于 class 元数据,以及(在 Java 7 之前)用于与编译时字符串常量(例如文字)相对应的字符串对象的字符串池。在Java7中,字符串池被移动到常规堆中。


1 - 好的。有时,升级是不可能的;例如由于旧硬件,或者 拒绝 做明智之事的客户。但是对于那些情况,你应该避免那种可能引入新的 PermGen 问题的新代码开发。并且您应该避免可能导致 PermGen 泄漏的 dev/test/deploy 做法(例如热加载)。