繁体   English   中英

PermGen空间的意义

[英]Significance of PermGen Space

PermGen空间在java中有什么意义?

PermGen空间保留给长期对象 - 主要是由ClassLoader加载的Class对象。 PermGen不会被垃圾收集,除非在非常特殊的情况下(特别是当加载这些类的ClassLoader超出范围时)。

这是一个垃圾收集优化 - 如果我们不希望被垃圾收集的对象被单独存储,它会压缩存储其余对象的空间,这导致垃圾收集器的工作量减少。

PermGen特定于具有世代垃圾收集的VM。

如果你使用JRockit,那么“PermGen的意义”就不存在了,因为JRockit没有这个概念。

几年前,当奇怪的“出于PermGen空间”错误开始出现并且没有人知道它的错误(Tomcat + Hibernate + Sun VM用来触发它)来替换其中一个组件时,它常见(现在问题已被理解,但几年前当他们开始裁剪时,很难找到任何有关此问题的信息)。 你可以用Resin替换Tomcat或用JRockIt替换Sun VM等。

我认为重要的是要指出PermGen不是Java规范的一部分,只是(相当)一些VM的实现细节。

您真正需要知道的唯一事情是PermGen空间与常规堆分开,并且不受-Xmx VM参数的影响。 如果您的应用程序加载了许多类定义(如应用程序服务器或IDE),则可以使用-XX:MaxPermSize VM选项设置PermGen空间大小。

永久代包含描述用户类的元数据(不属于Java语言的类)。

具有大型代码库的应用程序可以填满堆的这一部分,这将导致java.lang.OutOfMemoryError: PermGen 这不受-Xmx设置或机器上有多少内存的影响。 要设置新的初始大小,请使用-XX:PermSize=64m 要设置最大大小,请使用-XX:MaxPermSize=128m

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM