jstat -gcutil <PID> 1s 次数 查看内存堆栈
[jimw@TEST-2 /]$ jstat -gcutil 21360 1s 3
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 35.53 83.18 5.52 57.32 68307 2722.980 0 0.000 2722.980
32.95 0.00 3.18 5.52 57.32 68308 2723.043 0 0.000 2723.043
32.95 0.00 7.29 5.52 57.32 68308 2723.043 0 0.000 2723.043
通俗点来解释(可能不能达到标准的说法)
S0 S1 ,E,OP,YGC都是百分比的形式反馈
其中S0+S1+E 就是当前内存栈 所有利用的内存收集
O 则是旧数据的回收
当FGC一直彪高并且前者数据很大的时候,那么就需要检查代码是否正常,一般导致这样的情况都是内存溢出。
并且可以检查一下内存是否有加大。
参考:
之前遇到的一个坑,就是加大内存后,还是发现内存占用很大伴随着也会出现cpu过高导致程序异常的慢,因此需要用jvm的内置查询内存过大跟cpu过高的问题。
1. 查找进程
top查看进程占用资源情况
2.查找线程
使用top -H -p <pid>查看线程占用情况
3.查找java的堆栈信息
将线程id转换成十六进制
#printf %x 15664
#3d30
然后再使用jstack查询线程的堆栈信息
语法:jstack <pid> | grep -a 线程id(十六进制)
jstack <pid> | grep -A10 3d30>>/tmp/pid.log
接下来就可以找到代码所在的问题了。