一、故障分析与解决

1.dubbo-zookeeper注册中心数据量太大.导致客户端与其通信失败
异常现象图:

zk断连导致java系统内存溢出 zookeeper内存溢出_操作系统

2.异常分析
znode节点上的数据太大,超过长度,程序处理失败
3.解决方法
在zookeeper客户端程序启动start.sh中加入"-Djute.maxbuffer=10240000"增加它的最大容量
参数位置:JAVA_MEM_OPTS="-Djute.maxbuffer=10240000"
加入之后启动java程序,观察日志.无之前异常

二、zookeeper优化说明-设置zookeeper启动内存大小

1.编辑zookeeper/bin/zkEnv.sh配置文件

zk断连导致java系统内存溢出 zookeeper内存溢出_堆区_02

该文件已经明确说明有独立JVM内存的设置文件,路径是zookeeper/conf/Java.env,安装的时候这个路径下没有有java.env配置文件.需新建
#命令:
cat >>conf/java.env<<EOF
#!/bin/sh
export JAVA_HOME=/usr/java/jdk
# heap size MUST be modified according to cluster environment
# 默认2g,根据机器自身内存大小设置,注意事项下面说明
export JVMFLAGS="-Xms4g -Xmx4g"
EOF
2.堆区参数配置说明
1.-Xms :表示java虚拟机堆区内存初始内存分配的大小,通常为操作系统可用内存的1/64大小即可,但仍需按照实际情况进行分配。有可能真的按照这样的一个规则分配时,设计出的软件还没有能够运行得起来就挂了。
2.-Xmx: 表示java虚拟机堆区内存可被分配的最大上限,通常为操作系统可用内存的1/4大小。但是开发过程中,通常会将 -Xms 与 -Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。 一般来讲对于堆区的内存分配只需要对上述两个参数进行合理配置即可。

注:    
在配置之前一定要慎重的考虑一下自身软件所需要的非堆区内存大小,因为此处内存是不会被java垃圾回收机制进行处理的地方。并且更加要注意的是 最大堆内存与最大非堆内存的和绝对不能够超出操作系统的可用内存。