Java 永磁空间的意义

Java 永磁空间的意义,java,memory-management,jvm,permgen,Java,Memory Management,Jvm,Permgen,PermGen空间在java中的意义是什么?PermGen空间是为长期对象保留的,主要是类加载程序加载的对象。除非在非常特殊的情况下(特别是加载这些类的ClassLoader超出范围),否则PermGen不会被垃圾收集 这是一个垃圾收集优化-如果我们不希望垃圾收集的对象单独存储,它会压缩存储其余对象的空间,这会减少垃圾收集器的工作量。您真正需要知道的是,PermGen空间与常规堆是分开的,不受-XmxVM参数的影响。如果您有一个加载大量类定义的应用程序(如应用程序服务器或IDE),则可以使用-X

PermGen空间在java中的意义是什么?

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


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

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

永久生成保存描述用户类(不属于Java语言的类)的元数据


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

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

如果使用JRockit,那么“PermGen的重要性”就不存在了,因为JRockit没有这个概念

几年前,当奇怪的“PermGen空间不足”错误开始出现时,这是很常见的,当时还没有人知道是谁的错误(Tomcat+Hibernate+Sun VM用于触发此错误)来替换其中一个组件(现在这些问题已经被理解了,但多年前,当它们开始出现时,几乎不可能找到任何关于这方面的信息)。你可以用Resin替换Tomcat,或者用JRockIt替换Sun VM等等


我认为有必要指出,PermGen不是Java规范的一部分,只是(相当)的一个实现细节一些虚拟机。

您所指的类加载器是系统类加载器?引导类加载器加载的类存储在哪里?引导类加载器加载的类是语言中不可或缺的类,如
String
Object
。这是JVM本机实现的一部分,因此关于“where”没有标准答案。好的。那么permgen是否包含系统类加载器加载的类?是的,这是正确的。请记住,我们讨论的是JVM的Sun实现。permgen不是规范的一部分,因此另一个JVM(如另一张海报中提到的JRockit)也不在其中您所说的“不属于Java语言的类”是什么意思?您知道有哪些类不会存储在PermGen中吗?可能是重复的