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,也太歪了。