PermGen space的全称是Permanent Generation space,是指内存的永久保存区域
这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多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.
关于动态类
spring在AOP时使用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最彻底的解决办法就是不要用SUN的JDK,而改用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博客 ” ,链接:https://blog.itpub.net/10067101/viewspace-614604/
,如需转载,请注明出处,否则将追究法律责任。