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

标签 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

我在 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.* 对象的增长

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

enter image description here

如何解决?

最佳答案

以前管理过类似的问题,通过在 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/

相关文章:

java - 在 axis2 web 服务中检索 jsf bean 作为服务器请求

java - 为什么 Hibernate 会查询两次?

java - 构造函数中模拟 bean 的 NullPointerException - 如何通过首先自定义构造函数来正确模拟模拟 Bean?

java - jetty worker 。使用dockerfile创建镜像时出错

java - index.jsp 不起作用,仅在浏览器上显示源代码

jsf - 使用 f :convertNumber 时设置小数点分隔符

spring - 不使用Spring有什么问题

java - <jsp :include> doesn't work in magnolia cms

java - 如何在JSP的按钮单击事件上调用Java方法

java - SelectOneMenu 似乎改变了支持 bean 列表中的值