Java 混乱的Zookeeper内存使用
我有一个zookeeper的实例已经运行了一段时间。。。(JavaJava 混乱的Zookeeper内存使用,java,garbage-collection,apache-zookeeper,visualvm,Java,Garbage Collection,Apache Zookeeper,Visualvm,我有一个zookeeper的实例已经运行了一段时间。。。(Java1.7.0131,ZK3.5.1-1),带有-Xmx10G-XX:+UseParallelGC 最近领导层发生了变化,仲裁中大多数实例的内存使用量从~200MB增加到2GB+。我获取了一个jmapdump,我发现有趣的是有很多byte[]serialization数据(>1GB)没有GC根,但还没有被收集 (这是ByteArrayOutputStream,DataOutputStream,org.apache.jute.Binar
1.7.0131
,ZK3.5.1-1
),带有-Xmx10G-XX:+UseParallelGC
最近领导层发生了变化,仲裁中大多数实例的内存使用量从~200MB增加到2GB+。我获取了一个jmap
dump,我发现有趣的是有很多byte[]
serialization数据(>1GB)没有GC根,但还没有被收集
(这是ByteArrayOutputStream
,DataOutputStream
,org.apache.jute.BinaryOutputArchive
,或HeapByteBuffer
,BinaryOutputArchive
)
查看gc日志,选举变更前不久,完整gc每4-5分钟运行一次。选举后,任期阈值从1增加到15(最大值),完整GC运行的频率越来越低,最终在某些天甚至不运行
几天后,突然,对我来说不可思议的是,有些事情发生了变化,内存骤降到~200MB,每4-5分钟运行一次完整的GC
我在这里感到困惑的是,这么多的内存没有GC根,不能被完整的GC收集。我甚至尝试过几次从jcmd
触发GC.run
我想知道ZK故乡是否有什么东西抓住了这段记忆,或者泄露了这段记忆。。。这可以解释
我正在寻找任何调试建议;我计划升级Java1.8
,可能是ZK3.5.4
,但在继续之前,我真的很想从根本上解决这个问题
到目前为止,我已经使用了visualvm、GCviewer和EclipseMat
(实心垂直黑线表示完全GC。黄色表示年轻一代)。我不是ZK方面的专家。然而,我已经在Weblogic上调优JVM一段时间了,根据这些信息,我觉得您的配置正在生成堆的扩展和收缩(-Xmx10G-XX:+UseParallelGC)。因此,也许您应该尝试使用-Xms10G和-Xmx10G来避免这种大小调整。重要的是,每次调整JVM的大小时,都会执行一个完整的GC,因此避免这个过程是最小化完整垃圾收集数量的好方法 请看这个 “当热点JVM启动时,堆、年轻一代和perm生成空间将被删除 分配给由-Xms、-XX:NewSize和-XX:PermSize参数确定的初始大小 并根据需要增加到最大保留大小,即-Xmx- XX:MaxNewSize和-XX:MaxPermSize。如果 内存没有最初指定的那么多。但是,每次调整大小活动都会触发 完全垃圾收集(GC),因此会影响性能 建议您使初始尺寸和最大尺寸相同“ 资料来源: 如果你能提供你的gc.log,彻底分析这个案例会很有用 致以最良好的祝愿, 碾压混凝土