【发布时间】:2018-05-20 17:16:31
【问题描述】:
我有一个已经运行了一段时间的 zookeeper 实例...(Java 1.7.0_131,ZK 3.5.1-1),-Xmx10G -XX:+UseParallelGC。
最近领导层发生了变化,仲裁中大多数实例的内存使用量从 ~200MB 增加到 2GB+。我做了一个jmap 转储,我发现有趣的是有很多byte[] 序列化数据(>1GB)没有GC Root,但没有被收集。
(这是ByteArrayOutputStream、DataOutputStream、org.apache.jute.BinaryOutputArchive,或HeapByteBuffer、BinaryOutputArchive)。
查看 gc 日志,在选举更改前不久,full GC 每隔 4-5 分钟运行一次。选举结束后,tenuring 阈值从 1 增加到 15(最大值),full GC 运行的频率越来越低,最终甚至有几天都不运行。
几天后,对我来说,突然而神秘地发生了一些变化,内存骤降至约 200MB,Full GC 每 4-5 分钟运行一次。
我在这里感到困惑的是,没有 GC Root 的内存怎么可能没有被完整的 GC 收集。我什至尝试从jcmd 触发GC.run 几次。
我想知道 ZK 本土是否有什么东西在持有这个内存,或者泄漏这个内存......这可以解释它。
我正在寻找任何调试建议;我计划升级 Java 1.8,也许是 ZK 3.5.4,但我真的很想在继续之前解决这个问题。
到目前为止,我已经使用了 visualvm、GCviewer 和 Eclipse MAT。
【问题讨论】:
标签: java garbage-collection apache-zookeeper visualvm