【发布时间】:2015-12-26 20:37:07
【问题描述】:
我在 webapp 中修复了 3 个不同的PermGenOutOfMemoryError 问题,并且它在受限-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 内存。但是当我调用find最近的GC root时,我得到No GC root found。
No GC root found时PermGen OutOfMemoryError是什么原因?
OutOfMemoryError 的原因是否可能是在重新部署期间处理应用程序请求?
我特别低PermGen 在应用程序重新部署期间强制 PermGen 中的 GC,因为 PermGen 仅在内存压力下清理 - 我决定监控 OutOfMemoryError 是否仍然影响我的应用程序。
【问题讨论】:
标签: java out-of-memory permgen