ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PermGen space(1)

PermGen space(1)

原创 Linux操作系统 作者:xingtuyang 时间:2009-09-14 12:56:24 0 删除 编辑

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域

这一部分用于存放ClassMeta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放InstanceHeap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APPLOAD很多CLASS的话,就很可能出现PermGen space错误。

这种错误常见在web服务器对JSP进行pre compile的时候。 如果你的WEB APP下都用了大量的第三方jar, 其大小 超过了jvm默认的大小(4M)那么就会产生此错误信息了。

older空间不断“升级”对象给perm,如果older持续上来对象,perm space将吃不消。到一定程度时,perm space用差不多了,older对象又想上来就上不来了,此时new genneration等不到older腾出空间,这就出现植物人现象 或out of memory之类的现象了。

解决方法: 手动设置MaxPermSize大小
改正方法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

修改TOMCAT_HOME/bin/catalina.sh
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。
 
关于string pool
Interned java.lang.String objects are also stored in the permanent generation. The java.lang.String class maintains a pool of strings.
 
关于动态类
springAOP时使用CBLIB会动态产生很多类,也占用perm space
 
关于重新部署的时候perm space溢出
Why does the memory usage increase when I redeploy a web application? Because the Classloader (and the Class objects it loaded) cannot be recycled. They are stored in the permanent heap generation by the JVM, and when you redepoy a new class loader is created, which loads another copy of all these classes. This can cause OufOfMemoryErrors eventually.
 
本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!
 
对这个bug最彻底的解决办法就是不要用SUNJDK,而改用BEA JRokit
 
关于jrocket跟sun jdk在perm space上的区别
JRockit是用在服务器领域的高性能JVM,适合于在硬件条件好,长期高负载的环境下运行的。
JRockit是肯定比Hotspot快很多的,但是兼容性就要差一些,如果你用JRockit跑你的应用很稳定的话,那就没什么可担心的。
jrockit快,是因為他內部作了優化。看看Threads就知道了:
4 (Code Generation Thread 1)  RUNNABLE
5 (Code Optimization Thread 1)  RUNNABLE
3 (GC Main Thread)  RUNNABLE
9 (Sensor Event Thread)  RUNNABLE
2 (Signal Handler)  RUNNABLE
6 (VM Periodic Task)  RUNNABLE
两者的gc机制不太一样 如果你看下监控曲线就知道
sun是锯齿状的
jrockit是台阶状的
 
 
关于proxool造成内存溢出
开始用proxool从100万-300万插入200万数据,tomcat6 占用内存从168M一直涨到1G,在插入完毕后,通过jrmc手动垃圾回收后,通过jrmc观察,时间堆的占用量还在600M左右,怎么也回收不了。

用dbcp从300万-500万插入200万数据,tomcat6 占用内存从168M稍微涨了一点,但是内存变化不大。

用c3p0从500万-700万插入200万数据,tomcat6 占用内存基本没有什么变化。
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10067101/viewspace-614604/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-02-26

  • 博文量
    3
  • 访问量
    12677