Java 中的 PermGen-space 是什么?我们的团队在 PermGen-space 方面遇到了问题。这种增加最终会影响性能。
我想知道 PermGen-space 是什么,我们如何优化其空间使用?
答案 0 :(得分:10)
来自http://java.sun.com/docs/hotspot/gc1.4.2/faq.html(问题7--10)
永久世代应如何规模?
永久生成用于保存VM本身的反射,例如类对象和方法对象。这些反射物体直接分配到永久世代中,并且其尺寸独立于其他世代。通常,可以忽略此代的大小,因为默认大小足够。但是,加载许多类的程序可能需要更大的永久代。
如何判断永久世代是否正在填补?
从1.4.2 -XX开始:+ PrintGCDetails将打印有关在每个垃圾收集中收集的堆的所有部分的信息。完整系列
<完全GC [Tenured:30437K-> 33739K(280576K),0.7050569 secs] 106231K-> 33739K(362112K),[Perm:2919K-> 2919K(16384K)],0.7052334 secs]这个例子显示在永久世代中收集的很少(从收集前的2919K到收集后使用的2919K),并且当前的永久世代大小是16384K。
如何增加永久发电量?
使用命令行选项-XX:MaxPermSize =
我如何知道正在加载或卸载的类?
使用命令行选项-XX:+ TraceClassloading和-XX:+ TraceClassUnloading
答案 1 :(得分:2)
在JVM中,PermGen保存已加载/创建的类。这些信息像堆的其他部分一样被垃圾收集,但是有粗糙的边缘可以防止这种情况发生。只需增加PermGen空间
Start your JVM with
-XX:MaxPermSize=Xm
where X is a number like 128, 256.
关于此错误的好link
答案 2 :(得分:1)
基本上,Perm生成指的是堆上存储所有已加载类的空间。它专门用于存储类定义。
除了Java类的基本字段外,还有
* Methods of a class (including the bytecodes)
* Names of the classes (in the form of an object that points to a string also in the permanent generation)
* Constant pool information (data read from the class file, see chapter 4 of the JVM specification for all the details).
* Object arrays and type arrays associated with a class (e.g., an object array containing references to methods).
* Internal objects created by the JVM (java/lang/Object or java/lang/exception for instance)
* Information used for optimization by the compilers (JITs)
See此处。
答案 3 :(得分:0)
我知道这是一个旧线程,但是我认为值得一提的是Java 8引入后就没有PermGen空间。JDK 8 HotSpot JVM使用本机内存来表示类元数据,类似于Oracle JRockit和IBM JVM。元数据信息并没有消失,只是保存它的空间不再与Java堆相邻。元数据现在已移至本机内存中的“ Metaspace”区域。由于类元数据是从本机内存中分配的,因此最大可用空间是总可用系统内存。
此处有关于此主题的非常不错的文章:https://www.infoq.com/articles/Java-PERMGEN-Removed