Java内存泄漏,带有播放框架和Logback
我有几个Play framework应用程序运行没有问题 但是这里有一个应用程序,它有内存泄漏,我必须每24小时重新启动一次服务器,否则它会耗尽我所有的内存 我创建了一个堆转储,并用 问题是,我无法真正解释结果。Heaphero告诉我,Java内存泄漏,带有播放框架和Logback,java,memory-leaks,playframework,logback,heap-dump,Java,Memory Leaks,Playframework,Logback,Heap Dump,我有几个Play framework应用程序运行没有问题 但是这里有一个应用程序,它有内存泄漏,我必须每24小时重新启动一次服务器,否则它会耗尽我所有的内存 我创建了一个堆转储,并用 问题是,我无法真正解释结果。Heaphero告诉我,Java Static ch.qos.logback.core.util.ExecutorServiceUtil.THREAD\u FACTORY正在消耗我所有的内存,请参见此处: 详细链接显示: 这些都是Play Framework、Akka和logback
Java Static ch.qos.logback.core.util.ExecutorServiceUtil.THREAD\u FACTORY
正在消耗我所有的内存,请参见此处:
详细链接显示:
这些都是Play Framework、Akka和logback的内部类
另外,在我的代码中,我不使用任何计时器
,调度程序
,异步
,线程
等(这是一个非常简单的应用程序)
然后我使用jxray并得到一份报告,报告告诉我,我有838.727份akka.stream.stage.TimerMessages$的副本,正如您在这里看到的:
所以,我确实有内存泄漏,但如何才能找出原因?
欢迎任何提示
谢谢大家!
编辑1:
我试图回答评论中的问题
你说的“耗尽我所有的记忆”是什么意思?你有例外吗
我的意思是,应用程序使用我所有的服务器RAM和交换,直到我得到一个OOM。因为我知道,我每24小时重启一次java应用程序。这已经持续一年多了,所以最后一次OOM是在一年前。但我可以尝试不重新启动应用程序并收集OOM以进行更好的调试
您分析的堆转储是从OOM的角度分析的吗
不,堆转储来自应用程序,当它运行大约10小时时
你正在使用哪个版本的剧本
目前是2.7,但这个问题已经存在很长时间了,所以至少打2.6,可能是2.5甚至2.4
你的logback配置文件是什么样子的,你使用了特殊的附加器吗
以下是配置:
<configuration>
<conversionRule conversionWord="coloredLevel" converterClass="play.api.libs.logback.ColoredLevel"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%date - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
</encoder>
</appender>
<appender name="TRACELOGGER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/trace.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logFile.%d{yyyy-MM-dd}-trace.log</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%date - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{HH:mm:ss.SSS} %coloredLevel %logger{15} - %message%n%xException{5}</pattern>
</encoder>
</appender>
<logger name="performance" level="TRACE" additivity="false">
<appender-ref ref="TRACELOGGER"/>
</logger>
<logger name="play" level="INFO"/>
<logger name="application" level="INFO"/>
<logger name="net.sf.ehcache" level="INFO"/>
<root level="ERROR">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
12月30日。我做了一些优化,所以总体RAM使用量比以前少了,但仍然有一些泄漏。此外,当应用程序重新启动时,您可以看到RAM使用率每24小时下降一次。您还可以在此图表中看到一些手动重新启动
源代码可用吗
不幸的是没有
是否有演示应用程序重现问题
不幸的是没有,因为我必须在演示应用程序中创建相同的内存泄漏。由于我不知道它在哪里,我无法为此创建演示应用程序 有没有可能提供一个可复制的示例应用程序以及内存配置详细信息?您所说的“耗尽所有内存”是什么意思?你有例外吗?您分析的堆转储是从OOM的角度分析的吗?你正在使用哪个版本的剧本?你的logback配置文件是什么样子的,你使用了什么特殊的附件吗?谢谢你的指导性问题。我编辑了我的问题,添加了所有必要的细节。