Java内存设置与监控分析

设置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分析,可以帮助检测大对象,分析泄露情况

活动线程
Windows: netstat -ano|find "8080"|find "ESTABLISHED" /c
Linux: netstat -ano|grep "8080"|grep "ESTABLISHED"|wc -l


猜你喜欢

转载自liang-hr.iteye.com/blog/2367486