【发布时间】:2011-01-15 08:41:10
【问题描述】:
java中PermGen空间的意义是什么?
【问题讨论】:
标签: java memory-management jvm permgen
java中PermGen空间的意义是什么?
【问题讨论】:
标签: java memory-management jvm permgen
PermGen 特定于具有分代垃圾收集的 VM。
如果你使用 JRockit,那么“PermGen 的意义”是不存在的,因为 JRockit 没有这个概念。
它曾经很常见,几年前,当奇怪的“PermGen 空间不足”错误开始出现时,没有人知道是谁的错(Tomcat + Hibernate + Sun VM 曾触发此错误)来替换一个组件(现在问题已被理解,但几年前当他们开始种植时,几乎不可能找到任何关于此的信息)。您可以将 Tomcat 替换为 Resin 或将 Sun VM 替换为 JRockIt 等。
我认为重要的是要指出 PermGen 不是 Java 规范的一部分,而只是(相当)某些 VM 的实现细节。
【讨论】:
永久代保存描述用户类(不属于 Java 语言的类)的元数据。
具有大型代码库的应用程序可能会填满这部分堆,这将导致java.lang.OutOfMemoryError: PermGen。这不受 -Xmx 设置或机器上有多少内存的影响。要设置新的初始大小,请使用 -XX:PermSize=64m。要设置最大大小,请使用-XX:MaxPermSize=128m
【讨论】:
您真正需要知道的唯一一件事是 PermGen 空间与一般堆是分开的,并且不受 -Xmx VM 参数的影响。如果您有一个加载大量类定义的应用程序(如应用程序服务器或 IDE),那么您可以使用 -XX:MaxPermSize VM 选项设置 PermGen 空间大小。
【讨论】:
PermGen 空间是为长期对象保留的——主要是由ClassLoader 加载的Class 对象。 PermGen 不会被垃圾回收,除非在非常特殊的情况下(特别是当加载这些类的ClassLoader 超出范围时)。
这是一种垃圾收集优化 - 如果我们不希望被垃圾收集的对象单独存储,它会压缩存储其余对象的空间,从而减少垃圾收集器的工作。
【讨论】:
String 和Object。这是 JVM 原生实现的一部分,因此对于“在哪里”没有标准答案。