存在jetty内存泄漏问题的java服务器

存在jetty内存泄漏问题的java服务器,java,memory-leaks,server,jetty,Java,Memory Leaks,Server,Jetty,我正在运行这个嵌入Jetty服务器的应用程序。应用程序正在缓慢地消耗更多内存,尽管堆大小根本没有改变 这是启动应用程序的命令: java-server-Xms1G-Xmx1G-Dfile.encoding=UTF-8 这是NewRelic随RAM使用量增加而发布的图表 它开始使用1140MB,8小时后使用1290MB 这是堆的jvisualvm图表。 有什么建议吗 [第1版] 添加转储 [编辑二] 以下是我目前调查的一些记录 =如何监视堆外的内存 添加参数 -XX:NativeMemoryTr

我正在运行这个嵌入Jetty服务器的应用程序。应用程序正在缓慢地消耗更多内存,尽管堆大小根本没有改变

这是启动应用程序的命令:

java-server-Xms1G-Xmx1G-Dfile.encoding=UTF-8

这是NewRelic随RAM使用量增加而发布的图表 它开始使用1140MB,8小时后使用1290MB

这是堆的jvisualvm图表。

有什么建议吗

[第1版] 添加转储

[编辑二] 以下是我目前调查的一些记录

=如何监视堆外的内存 添加参数

-XX:NativeMemoryTracking=detail -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics
运行命令 jcmd 3322 VM.native_内存摘要 @看

=检查默认线程堆栈大小 java-XX:+PrintFlagsFinal-version | grep ThreadStackSize

intx ThreadStackSize=1024

=了解最大内存 最大内存=[-Xmx]+[-XX:MaxPermSize]+线程数*[-Xss] @看

=行动 减小线程堆栈的大小。(理论上,你可以低至64K…)

减少GC后堆空闲的最小百分比以避免扩展

-XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=10

现在将继续监控…

经过大量不同类型的调查后,我回到实验室,再次尝试

但这一次,我决定相信泄密报告中所说的:

加载的“org.hibernate.internal.SessionFactoryImpl”的一个实例 “sun.misc.Launcher$AppClassLoader@0xc001d4f8”占据2.956.808 (21,05%)字节。内存累积在一个实例中 加载的“org.hibernate.internal.SessionFactoryImpl” “sun.misc.Launcher$AppClassLoader@0xc001d4f8”

然后我将我的调查转移到我的DAO实现上,希望我忘记关闭一个或其他EntityManager调用。事实并非如此,所有这些都在使用后使用了一个很好的close()方法调用

然后我意识到问题可能出在hibernate本身,因为有问题的对象是一个SessionFactoryImpl,所以每次创建实体管理器时,我都将DAO实现更改为清除hibernate一级缓存,因为我无法找到禁用它的方法

一天结束结果=成功了!!:)内存稍有变化,几分钟后就会恢复,但不再以疯狂的方式增长(24小时1000MB)

这是我修改过的代码,希望对别人有所帮助

public EntityManager getEntityManager(){
    if( emf == null ){
        if (parameters == null) {
            emf = Persistence.createEntityManagerFactory(persistenceUnitName);
        } else {
            emf = Persistence.createEntityManagerFactory(persistenceUnitName, parameters);
        }
    } else {
        emf.getCache().evictAll();
    }

    EntityManager em = emf.createEntityManager();
    return em;
}

关键是:emf.getCache().executeAll()

您可能忘记关闭一个
可关闭的
事务
文件输出流
等。它也可能来自本机库的使用。谢谢@ArnaudDenoyelle,但我相信这会显示在堆使用率图表上,堆的大小始终小于400MB(悲伤)从提供的信息中无法判断您是否存在内存泄漏。@hamilton.lima在某个地方发布了HPROF堆转储,然后我们可以看一看,不可能说,您发布的所有信息都表明您的操作系统正在占用更多内存,这也可能是为了缓存,必要时将释放缓存。
public EntityManager getEntityManager(){
    if( emf == null ){
        if (parameters == null) {
            emf = Persistence.createEntityManagerFactory(persistenceUnitName);
        } else {
            emf = Persistence.createEntityManagerFactory(persistenceUnitName, parameters);
        }
    } else {
        emf.getCache().evictAll();
    }

    EntityManager em = emf.createEntityManager();
    return em;
}