PermGen空间在Java中的意义是什么?
PermGen实际代表什么的可能重复项?
PermGen空间是为长期对象保留的-大多数对象是ClassLoader加载的Class对象。除非在非常特殊的情况下(特别是当加载这些类的ClassLoader超出范围时),否则不会对PermGen进行垃圾回收。
这是垃圾收集的优化-如果我们不希望将垃圾收集的对象分开存储,则会压缩其余对象的存储空间,从而减少垃圾收集器的工作量。
您所指的ClassLoader是系统类加载器吗? 引导类加载器加载的类存储在哪里?
引导加载程序加载的类是该语言必不可少的类,例如String和Object。 这是JVM本地实现的一部分,因此没有关于" where"的标准答案。
精细。 那么permgen是否包含系统类加载器加载的类?
对,那是正确的。 请记住,我们正在谈论JVM的Sun实现。 PermGen不是该规范的一部分,因此另一个JVM(如另一位发布者提到的JRockit)将没有它。
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
"不属于Java语言的类"是什么意思? 您知道不会在PermGen中存储的任何类吗?