PermGen空间的意义
java中PermGen空间的意义是什么?
What is the significance of PermGen space in java?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
java中PermGen空间的意义是什么?
What is the significance of PermGen space in java?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
PermGen 空间是为长期对象保留的 - 主要是由
ClassLoader
加载的Class
对象。 PermGen 不会被垃圾回收,除非在非常特殊的情况下(特别是当加载这些类的 ClassLoader 超出范围时)。这是一种垃圾收集优化——如果我们不希望被垃圾收集的对象单独存储,它会压缩其余对象存储的空间,从而减少垃圾收集器的工作。
PermGen space is reserved for long-term objects - mostly
Class
objects loaded by theClassLoader
. PermGen will not be garbage collected except under very special circumstances (specifically, when theClassLoader
that loaded those classes goes out of scope).This is a garbage collection optimization - if objects that we don't expect to be garbage collected are stored separately, it compacts the space where the rest of the objects are stored, which leads to less work for the garbage collector.
PermGen 特定于具有分代垃圾收集的 VM。
如果您使用 JRockit,那么“PermGen 的意义”就不存在,因为 JRockit 没有这个概念。
几年前,当奇怪的“Out of PermGen space”错误开始出现并且没有人知道是谁的错(Tomcat + Hibernate + Sun VM 用于触发此问题)以替换其中一个组件时,这种情况曾经很常见(现在这些问题已经被理解,但几年前当他们开始种植时,几乎不可能找到任何关于这方面的信息)。您可以将 Tomcat 替换为 Resin,或者将 Sun VM 替换为 JRockIt 等。
我认为需要指出的是,PermGen 不是 Java 规范的一部分,而只是(相当)某些 VM 的实现细节。
The PermGen is specific to VMs having generational garbage collection.
If you use, say, JRockit, the "significance of PermGen" is non-existent because JRockit doesn't have that concept.
It uses to be common, a few years ago, when the weird "out of PermGen space" errors started appearing and that nobody knew yet whose fault it was (Tomcat + Hibernate + Sun VM used to trigger this) to replace one of the component (nowadays the problems are understood, but years ago when they started cropping it was hardly possible to find any information on this). You could replace Tomcat with Resin or the Sun VM with JRockIt etc.
I think it's important to point out that PermGen are not part of the Java specs and only an implementation detail of (quite) some VMs.
您真正需要知道的唯一一件事是 PermGen 空间与通用堆分开,并且不受
-Xmx
VM 参数的影响。如果您有一个加载大量类定义的应用程序(例如应用程序服务器或 IDE),那么您可以使用 -XX:MaxPermSize VM 选项设置 PermGen 空间大小。The only thing you really need to know is that PermGen space is separate from the general heap and not affected by the
-Xmx
VM parameter. If you have an application that loads lots of class definitions (like an application server or an IDE) then you can set the PermGen space size using the-XX:MaxPermSize
VM option.永久代保存描述用户类(不属于 Java 语言的类)的元数据。
具有大型代码库的应用程序可能会填满堆的这一部分,这将导致
java.lang.OutOfMemoryError: PermGen
。这不受 -Xmx 设置或计算机上有多少内存的影响。要设置新的初始大小,请使用-XX:PermSize=64m
。要设置最大大小,请使用 -XX:MaxPermSize=128mThe permanent generation holds meta-data describing user classes (classes that are not part of the Java language).
Applications with large code-base can fill up this segment of the heap which will cause
java.lang.OutOfMemoryError: PermGen
. This is not affected by the -Xmx setting or how much memory you have on the machine. To set a new initial size, use-XX:PermSize=64m
. To set a maximum size, use-XX:MaxPermSize=128m