Java内存泄漏,带有播放框架和Logback

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

我有几个Play framework应用程序运行没有问题

但是这里有一个应用程序,它有内存泄漏,我必须每24小时重新启动一次服务器,否则它会耗尽我所有的内存

我创建了一个堆转储,并用

问题是,我无法真正解释结果。Heaphero告诉我,
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配置文件是什么样子的,你使用了什么特殊的附件吗?谢谢你的指导性问题。我编辑了我的问题,添加了所有必要的细节。