为方便本身查看,根据工做遇到的问题,转载并整理如下jvm优化内容linux
有次接到客服反馈,生产系统异常,没法访问。接到通知紧急上后台跟踪,查看了数据库死锁状况--正常,接着查看tomcat 内存溢出--正常,再去跟踪流量--正常。没折了,把生产系统重起,刚开始几分钟,监控显示一切正常,过几分钟状况恢复正常。再去检查apache代理机,发现代理机长时间没有返回形成阻塞宕机。问题由此肯定。接着查看了xxx.com/proxoolAdmin?alias=ec&tab=snapshot 数据链接池状况,发现链接池爆满了。再次验证了生产系统存在长时间处理的业务。数据库
从这个问题反映出,生产系统上压力测试存在问题,基本的压力测试流程没有,同时经过此次排查异常也暴露了本身自己在jvm异常优化方面经验缺失。apache
接下来狠狠的给本身补齐这门jvm优化的相关知识。调优的目的是保持jvm稳定,而不是提升tqs等4个9的参数指标。windows
调整jvm内存等关键信息tomcat
配置tomcat调用的虚拟机内存大小jvm
(1)直接设置tomcattcp
Linux工具
修改TOMCAT_HOME/bin/catalina.sh
位置cygwin=false前。
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m" (仅作参考,具体数值根据本身的电脑内存配置)性能
windows测试
修改TOMCAT_HOME/bin/catalina.bat
第一行加上
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m" 、
最大内存数最好不要超过系统内存是一半,一半设置为三分之一的较好。各个参数参照比例设置基本问题不大。
(2)配置环境变量
环境变量中设 变量名:JAVA_OPTS 变量值:-Xms512m -Xmx512m
排查jvm异常主要包括内存使用状况,使用jstat 统计gc。死锁状况,因此须要定位到具体类,jstack 能够查看死锁。
jstat -class pid:显示加载class的数量,及所占空间等信息。
各列意义:
1、使用jps
查看线程ID
2、使用jstat -gc 3331 250 20
查看gc状况,通常比较关注PERM区的状况,查看GC的增加状况。
3、使用jstat -gccause
:额外输出上次GC缘由
4、使用jmap -dump:format=b,file=heapDump 3331
生成堆转储文件
5、使用jhat或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆状况。
6、结合代码解决内存溢出或泄露问题。
使用jstack -F pid
经常使用的压力测试工具及命令
loadrunner,jmeter,tcpcopy
tcpcopy是拷贝线上流量,对于已有接口和服务作压力测试是个神器,jmeter和loadrunner是压力测试工具,loandrunner压测结果更详细可视化不过笨重收费并且须要不少客户机,jmeter相对是平民版的loadrunner,胜在免费。
jmap,jstack,jstat。jstat查看内存回收概况,实时查看各个分区的分配回收状况,jmap查看内存栈,查看内存中对象占用大小,jstack查看线程栈,死锁,性能瓶颈,某个线程使用cpu太高致使服务总体慢等均可以经过在这些命令辅助Linux命令看出来。
top,vmstat,sar,dstat,traceroute,ping,nc,netstat,tcpdump,ss等等。