我用
Tomcat 8.0.26
jsf 2.2.12
primefaces 5.2
Spring Boot 1.2.6.RELEASE
Spring 4.2.1.RELEASE
我在 Tomcat Web Application Manager
中使用了 Reload
按钮,在重新加载我的应用程序 (domain-api
) 后出现了以下问题:
The following web applications were stopped (reloaded, undeployed), but their
classes from previous runs are still loaded in memory, thus causing a memory
leak (use a profiler to confirm):
/domain-api
此外,通过 Java VisualVM,我可以看到“重新加载”后 javax.faces.*
对象的增长
这是采样器内存快照比较:
如何解决?
最佳答案
以前管理过类似的问题,通过在 JAVA_OPTS 中调整 java 垃圾收集器解决了这个问题:
JAVA_OPTS="$JAVA_OPTS -XX:+CMSParallelRemarkEnabled -XX:ParallelGCThreads=8 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=35 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:-UseAdaptiveSizePolicy -XX:SurvivorR比例= 6"
地点:
-XX:+UseCMSInitiatingOccupancyOnly 避免对垃圾收集器功能使用启发式规则。
-XX:CMSInitiatingOccupancyFraction 当CMS(Concurrent MArk Sweeper)被激活时的位置。
-XX:-UseAdaptiveSizePolicy 禁用调整内存世代大小(有了这个我们可以设置参数 -XX: SurvivorRatio = 6)。
-XX:SurvivorRatio=6 将eden survivor 关系设置为1:6,这将为年轻对象提供更多空间。
为了优化垃圾收集器线程的性能,使用了以下参数:
-XX:+CMSParallelRemarkEnabled : 减少 CMS 之间的停顿。
-XX:ParallelGCThreads=8 设置垃圾收集的并行线程数为8(每个服务器处理器一个)。
-XX:+UseParNewGC 当你有多个处理器时,这个收集器与多线程中的原始收集器不同。
-XX:+UseConcMarkSweepGC 是并发收集器的一种垃圾收集算法,它试图在后台完成大部分垃圾收集工作,而不会在运行时停止应用程序线程。
在我的例子中,使用这些选项可以更快地释放内存。更快地清理伊甸园和旧内存,优化资源释放。
关于spring - JSP/PrimeFaces Spring Boot Tomcat 内存泄漏问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32869116/