JSP / PrimeFaces Spring Boot Tomcat内存泄漏问题

时间:2015-09-30 14:46:17

标签: spring jsp jsf tomcat primefaces

我用

Tomcat 8.0.26
jsf 2.2.12
primefaces 5.2
Spring Boot 1.2.6.RELEASE
Spring 4.2.1.RELEASE

我在Reload中使用Tomcat Web Application Manager按钮,重新加载我的应用程序(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.*个对象的增长

这是采样器内存快照比较:

enter image description here

如何解决?

1 个答案:

答案 0 :(得分:1)

在很久以前管理类似的问题,它已经通过在JAVA_OPTS中调整java垃圾收集器来解决:

JAVA_OPTS =" $ JAVA_OPTS -XX:+ CMSParallelRemarkEnabled -XX:ParallelGCThreads = 8 -XX:+ UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction = 35 -XX:+ UseParNewGC -XX:+ UseConcMarkSweepGC -XX:-UseAdaptiveSizePolicy -XX :SurvivorRatio = 6"

其中:

-XX:+ UseCMSInitiatingOccupancy只允许对垃圾收集器功能使用启发式规则。

-XX:CMS(Concurrent MArk Sweeper)激活后的CMSInitiatingOccupancyFraction位置。

-XX:-UseAdaptiveSizePolicy禁用了内存生成(我们可以设置参数-XX:SurvivorRatio = 6)。

-XX:SurvivorRatio = 6将伊甸园幸存者关系设定为1:6,这将为年轻物体提供更多空间。

为了优化垃圾收集器线程的性能,使用了以下参数:

-XX:+ CMSParallelRemarkEnabled:减少CMS之间的暂停。

-XX:ParallelGCThreads = 8设置8个垃圾收集的并行线程数(每个服务器处理器一个)。

-XX:+ UseParNewGC当您有多个处理器时,此收集器与多个线程中的原始集合进行并行化。

-XX:+ UseConcMarkSweepGC它是并发收集器一种垃圾收集算法,它尝试在后台执行大部分垃圾收集工作,而不会在运行时停止应用程序线程。

在我的情况下,使用这些选项可以更快地释放内存。伊甸园和旧记忆得到了更快的清理,优化了资源的释放。