烫发是堆的一部分吗?

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

回答

首先,现代 JVM 没有 PermGen

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

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

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

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

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

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


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


以上是烫发是堆的一部分吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>