我正在使用Apache Thrift运行Java服务器并对其进行分析我发现内存(Old Gen)总是在增长,如下图所示:
图表末尾的急剧下降是因为我点击了#34;执行GC"。
我知道这里有内存泄漏。所以我运行了一个检漏仪(MAT)并报告如下:
" com.sun.jmx.remote.internal.ArrayNotificationBuffer"的一个实例 加载""占据7,844,208(77.22%)字节。
我自己从不使用这个类,所以我假设Apache Thrift在内部使用它。我还发现ArrayNotificationBuffer
内存泄漏this actually is an old known fixed JDK bug。
所以我对此有一些疑问:
为什么当我点击"执行GC"分配的内存有这么大的下降吗? GC自动运行不一样吗?为什么它不会垃圾收集这个记忆呢?
我使用OpenJDK(7u55-2.4.7-1ubuntu1~0.12.04.2)和as far as I can see所有与ArrayNotificationBuffer
相关的错误已经很老了并修复了,为什么会发生这种情况呢?如何解决?
答案 0 :(得分:1)
运行GC()时清除分配的事实只是意味着最终会被释放的合法内存块。如果你的堆很大并且其他分配请求没有失败,那么旧的gen可能会推迟一段时间。
至于缓冲区,我会推测JMX通知监听器已经注册,但没有及时处理发出的通知,但很难说。