首页 > 解决方案 > perm gen 是堆的一部分吗?

问题描述

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

标签: javajvmheap-memory

解决方案


首先,现代 JVM 没有 PermGen

PermGen 在 Java 8 中完全被删除了。所以学习它真的没有什么意义。Java 8 之前的所有 Java 版本都已停产,您应该在很久以前就迁移过您的代码。如果您在 Java 8 之前的 JVM 上的遗留应用程序中遇到 PermGen 问题,这是移植它的另一个原因1

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

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

这两种描述都是正确的,取决于你的观点。不可辩论的事实是:

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

PermGen 用于类元数据,并且(在 Java 7 之前)用于字符串池,用于对应于编译时字符串常量(例如文字)的字符串对象。在 Java 7 中,字符串池被移至常规堆。


1 - 好的。有时,升级是不可能的;例如,由于遗留硬件,或拒绝做明智之举的客户。但是对于这些情况,您应该避免可能引入新 PermGen 问题的新代码开发。并且您应该避免可能导致 PermGen 泄漏的开发/测试/部署实践(例如热加载)。


推荐阅读