Why
对于java开发者来说,JVM是个绕不过的坑。就好比武林中人,需要时时刻刻修炼的内功一样。但对于一些人,总是要等到出了问题才能想起它的重要性,自己就是其中之一。希望趁着这次机会,好好梳理下这方面的内容。
这次为项目写了个TCP的服务器,使用了Netty作为基础框架,运行在LInux服务器上,首先要保证单机服务器的性能。
准备
-
程序开发(以后可能会写,这里不展开)
实现的功能:TCP服务器双向工作(数据上报,数据下发)、数据解析、数据存储(Mysql,Mongo,Redis)、扩展性(集群部署) -
使用脚本后台部署
#!/bin/bash
#启动插件
package_name="tcp-server_fat.jar"
tcp_jar_pid=$(ps aux | grep "${package_name}" |grep -v 'grep')
echo "tcp-server_fat is $tcp_jar_pid"
if [[ "$tcp_jar_pid" != "" ]]; then
echo "killing process"
ps aux | grep "${package_name}" | grep -v 'grep' | awk '{print $2}' |xargs kill -9
fi
echo "start the ${package_name}"
JAVA_OPTS="$JAVA_OPTS -Xms512m -Xmx512m"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=59.110.233.215"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=8811"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=8811"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
nohup java $JAVA_OPTS -jar ${package_name} >eclipse_tcp.log 2>&1 &
sleep 3
new_tcp_jar_pid=$(ps aux | grep "${package_name}" |grep -v 'grep')
echo "new mqtt_jar_pid is $new_tcp_jar_pid"`
脚本说明
部署的服务需要后台运行,所以使用
nohup java $JAVA_OPTS -jar ${package_name} >eclipse_tcp.log 2>&1 &
java运行参数使用了
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=59.110.233.215"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=8811"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=8811"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
以上参数是为了Jconsole的远程连接,其中 com.sun.management.jmxremote.rmi.port 参数如果不指定,虚拟机会随机使用一个端口,如果使用的端口被防火墙禁止,则无法连接。
部署成功后,进行压力测试和性能检测
正常状态该是什么样
- CPU高负载时占用上升,低负载时占用下降
- 内存稳定,无泄露,无溢出
- 线程无死锁
测试及监测
主要测试内容: 压力测试使用Jmeter,模拟tcp连接,查看高连接状态下的CPU和内存的使用情况;使用Jconsole检查各项变化;使用jmap查看内存使用情况,生成dump文件,使用MAT进行内存分析;
- Jmeter使用
- Jconsole及top命令监测
- jmap 命令使用
- jstat 命令
- jstack
- MAT分析
疑问1: java程序部署后,在空载状态下,top命令显示的内存缓慢上升,上升到一定值后,停止上升。谁知道原因?