Gal*_*101 7 java garbage-collection jvm permgen
我的应用程序显示"老一代"/"终身代"的大小上升,当达到"老一代"的最大限制时,突然PermGen大小增加.这是我的一代sizings:
-Xmx1200m -Xms1200m -Xmn450m -XX:MaxPermSize=600m -XX:+UseParallelGC
Run Code Online (Sandbox Code Playgroud)
这是在32位Fedora上,所以不能有比这更大的堆.
该应用程序没有进行任何花哨的类加载,虽然它使用Spring IOC和Hibernate,但Spring App-context.xml定义了大约1000个Beans.
这个应用程序以175MB PermGen开始,在几小时内稳定增加到~250MB,一直保持到Tenured Generation达到~780 MB,然后permgen跳到~500MB而Old Gen降到~500MB.
这迫使我每天重启应用程序,并让我真正害怕迫在眉睫的OutOfMemory错误..任何见解都会非常有帮助.
谢谢Gala101
13/May:有人可以说一下当'Old Gen'被垃圾收集时会发生什么吗?
jvm是否将"Old Gen"的藏品放入PermGen?
我的PermGen峰值仅在"Old Gen"收集时出现,而OldGen尺寸的减少与PermGen尺寸的增加密切相关.
PS:我没有进行任何实时部署/取消部署,因为这肯定会占用PermGen.
下面是我的监控页面中的当前spanshot :(承诺的部分刚刚从~250 MB跳到500 MB)
PS Perm Gen
Type Non-heap memory
Usage init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K)
Peak Usage init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K)
Collection Usage init = 16777216(16384K) used = 252421536(246505K) committed = 504954880(493120K) max = 629145600(614400K)
Run Code Online (Sandbox Code Playgroud)
我会按照 leonm 的建议来分析什么占用了这么多内存。我敢打赌你有某种令人讨厌的内存泄漏。
你说你不做任何花哨的类加载,但 Hibernate 会为你动态生成一些类。您是否使用一些 AOP 功能(例如来自 Spring AOP 模块?)。
基本上,如果您用完了 PermGen 空间,那么您的应用程序似乎会继续生成新类(因为它的类存储在 PermGen 中)。