在 Linux 上 ZooKeeper 占用内存高,通常不是“内存泄漏”,而是由其设计机制 + 配置 + 使用方式决定的。下面按常见原因从高到低说明,并给出排查和优化建议。
ZooKeeper 是 Java 应用,内存主要消耗在 JVM Heap。
典型现象:
top 看 RES 很高(比如 2G、4G)原因:
-Xmx 设得很大✅ 查看方式:
ps -ef | grep zookeeper
# 或
jmap -heap <pid>
✅ 建议:
-Xmx1g -Xms1g-Xmx2g -Xms2gZooKeeper:
虽然不在 JVM 堆里,但:
free -m 看起来“内存被用光”✅ 查看:
free -h
cat /proc/meminfo | grep -i cached
✅ 说明:
影响:
✅ 排查:
zkCli.sh
ls /
# 看节点数量
✅ 建议:
✅ 查看:
echo wchs | nc localhost 2181
echo wchc | nc localhost 2181
✅ 建议:
✅ 查看:
jstat -gc <pid>
✅ 建议:
-XX:MaxDirectMemorySize=512m
✅ 建议:
# 1. 看实际占用
free -h
top -p <pid>
# 2. 看 JVM 配置
ps -ef | grep zookeeper
# 3. 看节点数
zkCli.sh ls /
# 4. 看 watch
echo wchs | nc localhost 2181
# 5. 看堆
jmap -heap <pid>
ZooKeeper 内存高,大多是 JVM 堆配太大 + znode/watch 过多 + Linux 缓存,而不是真的“泄漏”。
如果你愿意,可以贴:
free -hps 里的 JVM 参数我可以帮你精确判断是哪一类问题。