设置Java运行时内存(tomcat为例)
JAVA_OPTS="-server -Xms2048M -Xmx2048M -Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M";
server模式,堆内存2G,新生代512MB,永久代256MB,收集器由jvm自动选择。
各区域大小应根据应用的实际情况调整,推荐参数为:不配置。
内存分配情况查看
查看堆内存分配情况:jmap -heap pid
活动实例采集:jmap–histo:live pid
内存回收情况( jstat -gcutil pid 3000 3)
pid : 608 每3秒采集一次,共采集3次
gcutil 可观察jvm内存回收情况,s0,s1为 from/to space空间,e表示eden区占用率,o为老年区占用率,p为永久区占用率,ygc表示新生代gc次数,fgc表示full gc次数。
频繁的 ygc,特别是 fgc 将很可能导致CPU高占用现象,这时需要结合以下的 thread dump 或堆转储找出原因。
高占用CPU线程
使用工具 top -H (Linux) ProcessExplorer (Windows),找出高占线程ID
转十六进制后,在下面的 thread_dump 中查找
Thread dump
1. Visual VM 下的 ThreadDump
2. kill -3 java_pid (linux )或 ctrl + break ( windows )
3. jstack pid > thread_dump.txt
dump 出系统正在运行的线程信息,是定位源码位置的关键手段
Heap dump
jmap -dump:format=b,file=m.hprof pid
生成堆转储文件,再结合mat分析,可以帮助检测大对象,分析泄露情况
jmap -dump:format=b,file=m.hprof pid
生成堆转储文件,再结合mat分析,可以帮助检测大对象,分析泄露情况
活动线程
Windows: netstat -ano|find "8080"|find "ESTABLISHED" /c
Linux: netstat -ano|grep "8080"|grep "ESTABLISHED"|wc -l