java中的PermGen空间

时间:2010-01-19 09:17:02

标签: java

Java 中的 PermGen-space 是什么?我们的团队在 PermGen-space 方面遇到了问题。这种增加最终会影响性能。

我想知道 PermGen-space 是什么,我们如何优化其空间使用?

4 个答案:

答案 0 :(得分:10)

来自http://java.sun.com/docs/hotspot/gc1.4.2/faq.html(问题7--10)

  1. 永久世代应如何规模?

    永久生成用于保存VM本身的反射,例如类对象和方法对象。这些反射物体直接分配到永久世代中,并且其尺寸独立于其他世代。通常,可以忽略此代的大小,因为默认大小足够。但是,加载许多类的程序可能需要更大的永久代。

  2. 如何判断永久世代是否正在填补?

    从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。

  3. 如何增加永久发电量?

    使用命令行选项-XX:MaxPermSize =

  4. 我如何知道正在加载或卸载的类?

    使用命令行选项-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