我在网络应用中修复了3个不同的PermGen
OutOfMemoryError
个问题,并且在限制-XX:MaxPermSize=66m
中可以进行任意数量的重新部署(我不会尝试大于30)。运行应用程序需要大约55 MB的PermGen
。
修复内存泄漏的主要原因是练习并使开发环境更加愉快 - 编译后<Context reloadable="true">
我的webapp在3秒后重新部署!
刚才我在catalina.out
找到了错误:
Dec 26, 2015 5:28:09 PM org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor run
SEVERE: Unexpected death of background thread ContainerBackgroundProcessor[StandardEngine[Catalina]]
java.lang.OutOfMemoryError: PermGen space
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]"
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]"
像往常一样,我运行visualvm
并运行OQL:
select unique(map(heap.objects('java.lang.ClassLoader'), 'classof(it)'))
并审核org.apache.catalina.loader.WebappClassLoader
个实例。我实际上做的事情可以通过OQL来描述:
filter(heap.objects('org.apache.catalina.loader.WebappClassLoader'),
'it.state.name.toString() == "DESTROYED"')
那个实例没有释放PermGen
内存。但当我调用找到最近的GC根时,我得到找不到GC根。
PermGen OutOfMemoryError
时No GC root found
的原因是什么?
OutOfMemoryError
在重新部署期间处理应用程序请求的原因是否可能?
我特别低PermGen
在应用程序重新部署期间强制执行PermGen中的GC,因为PermGen
仅在内存压力下清理 - 我决定监视OutOfMemoryError是否仍会影响我的应用程序。
答案 0 :(得分:1)
有一些值得关注的事情。