Java 正在运行Apache Thrift服务器的内存泄漏

Java 正在运行Apache Thrift服务器的内存泄漏,java,memory-leaks,garbage-collection,jmx,thrift,Java,Memory Leaks,Garbage Collection,Jmx,Thrift,我使用Apache Thrift运行Java服务器,并对其进行分析,我发现内存(旧版本)一直在增长,如下图所示: 图表末尾的急剧下降是因为我单击了“执行GC” 我知道这里有内存泄漏。因此,我运行了一个泄漏检测器(),它报告如下: “com.sun.jmx.remote.internal.ArrayNotificationBuffer”的一个实例 由“”加载的占用7844208(77.22%)字节 我自己从来没有使用过这个类,所以我假设Apache Thrift在内部使用这个类。我还发现Arr

我使用Apache Thrift运行Java服务器,并对其进行分析,我发现内存(旧版本)一直在增长,如下图所示:

图表末尾的急剧下降是因为我单击了“执行GC”

我知道这里有内存泄漏。因此,我运行了一个泄漏检测器(),它报告如下:

“com.sun.jmx.remote.internal.ArrayNotificationBuffer”的一个实例 由“”加载的占用7844208(77.22%)字节

我自己从来没有使用过这个类,所以我假设Apache Thrift在内部使用这个类。我还发现
ArrayNotificationBuffer
内存泄漏

所以我有一些问题要问:

  • 为什么当我单击“执行GC”时,分配的内存中会出现这样的下降?GC不是自动运行的吗?为什么它不垃圾收集这个内存呢

  • 我使用OpenJDK(7u55-2.4.7-1ubuntu1~0.12.04.2),所有与
    ArrayNotificationBuffer
    相关的bug都非常陈旧且已修复,为什么会发生这种情况?如何修复它


  • 当您运行GC()时,分配被清除,这一事实只意味着最终会释放一块合法的内存。若您的堆很大,并且其他分配请求并没有失败,那个么旧的gen可能会延迟一段时间


    至于缓冲区,我推测JMX通知侦听器已注册,但未及时处理发出的通知,但很难说。

    快速搜索显示Thrift sources中未出现
    ArrayNotificationBuffer
    。@JensG我想我错了,JMX实际上是由JVM本地使用的。好吧,我知道释放旧gen可能会被延迟,但延迟了将近2天?为何过时的对象有什么用?知道如何修复JMX漏洞吗?在我看来,一个70 MB的老版本是相当平凡的,除非您运行的是一个资源严重受限的环境。[服务器]JVM的默认堆空间通常在1GB区域,所以我不认为这是一种异常状态。好的,我知道了,谢谢,那JMX呢?我认为JMX是JVM的,而不是Thrift的,但我不知道如何配置或禁用这个…Weelll。。。。它可能只是您的jconsole实例。那是不是连续两天都是这样?默认情况下,jconsole会注册一些通知侦听器。尝试服务器的新实例,不要使用jconsole。使用jstat查看统计数据(与jconsole相同的核心协议,但没有UI,因此不注册任何侦听器,或者至少注册更少的侦听器……)。我乐观的猜测是,你不会看到这么大的notif缓冲区。是的,我也在考虑做同样的事情,谢谢你的见解,我会试试这个,然后在这里报告,再次感谢!