我用
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.*
个对象的增长
这是采样器内存快照比较:
如何解决?
答案 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它是并发收集器一种垃圾收集算法,它尝试在后台执行大部分垃圾收集工作,而不会在运行时停止应用程序线程。
在我的情况下,使用这些选项可以更快地释放内存。伊甸园和旧记忆得到了更快的清理,优化了资源的释放。