【问题标题】:Confusing Zookeeper Memory usage令人困惑的 Zookeeper 内存使用情况
【发布时间】: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,但没有被收集。

(这是ByteArrayOutputStreamDataOutputStreamorg.apache.jute.BinaryOutputArchive,或HeapByteBufferBinaryOutputArchive)。

查看 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。

(黑色竖线是full GC。黄色是年轻代)。

【问题讨论】:

    标签: java garbage-collection apache-zookeeper visualvm


    【解决方案1】:

    我不是 ZK 方面的专家。但是,我已经在 Weblogic 上调整 JVM 有一段时间了,基于此信息,我觉得您的配置正在生成堆的扩展和收缩 (-Xmx10G -XX:+UseParallelGC)。因此,也许您应该尝试使用 -Xms10G 和 -Xmx10G 来避免这种调整大小。重要的是,每次调整 JVM 大小时都会执行一次完整 GC,因此避免此过程是最小化完整垃圾回收次数的好方法。

    请阅读本文

    "当一个 Hotspot JVM 启动时,堆、年轻代和永久代空间是 分配给由 -Xms、-XX:NewSize 和 -XX:PermSize 参数确定的初始大小 分别,并根据需要递增到最大保留大小,即-Xmx,- XX:MaxNewSize 和 -XX:MaxPermSize。 JVM 也可能会在运行时缩小实际大小,如果 不像最初指定的那样需要内存。 但是,每次调整大小活动都会触发 完全垃圾收集 (GC),因此会影响性能。作为最佳实践,我们 建议您使初始尺寸和最大尺寸相同”

    来源:http://www.oracle.com/us/products/applications/aia-11g-performance-tuning-1915233.pdf

    如果你能提供你的 gc.log,彻底分析这个案例会很有用。

    最好的问候, 碾压混凝土

    【讨论】:

      猜你喜欢
      • 2019-04-03
      • 1970-01-01
      • 2013-02-11
      • 2020-11-10
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 2022-01-21
      • 2022-01-17
      相关资源
      最近更新 更多