欢迎光临成都无标度网络科技有限公司!



该死的JAVA permanent generation memory leak

2012-03-15 06:02    编辑:蝙蝠    阅读: 9587
    JVM的内存区分为堆和非堆,堆分为新域和旧域,非堆又叫永久域,即permanent generation(又称Perm Gen)。堆中一般放得都是实例,而非堆中放的是类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码及动态生成的类等等。 
 
    JAVA的GC功能收集堆中的垃圾,但是非堆中加载的类却无法被GC。在SWING等程序中,应用中止时一般就直接关闭了进程,但在JAVA EE开发中,所有的应用都在服务器这一进程中,发布应用或reload一个应用会不断加载类而不能被GC,反复reload必然造成Perm Gen溢出,即常见的PermGen Space异常。 
 
    原理清楚了,但气人的是目前没有找着解决办法。JAVA一开始就被设计成编译型静态语言,而面对这种“动态”问题考虑不足。 
 
    这个问题可把俺害惨了。SUN至今还有这种BUG,也太歪了。