1、相关命令
jps
/*内存信息输入到 log.txt 文件中
*num:序号 instances:实例数量 bytes:占用空间大小
*class name:类名称,[C is a char[],[S is a short[],
*[I is a int[],[B is a byte[],[[I is a int[][]
*/
jmap -histo 进程id > ./log.txt
//查看堆的详细信息,各个区域的使用情况
jmap -heap 进程id
//查找死锁
jstack 进程id
//查找占用cup的进程
top -p <pid>
-------> H
jstack 进程id | grep -A 10 16进制的id
//查看JVM参数
Jinfo
/*垃圾回收
* S0C:第一个幸存区的大小,单位KB
* S1C:第二个幸存区的大小
* S0U:第一个幸存区的使用大小S1U:第二个幸存区的使用大小
* EC:伊甸园区的大小
* EU:伊甸园区的使用大小
* OC:老年代大小
* OU:老年代使用大小
* MC:方法区大小(元空间)
* MU:方法区使用大小
* CCSC:压缩类空间大小
* CCSU:压缩类空间使用大小
* YGC:年轻代垃圾回收次数
* YGCT:年轻代垃圾回收消耗时间,单位s
* FGC:老年代垃圾回收次数
* FGCT:老年代垃圾回收消耗时间,单位s
* GCT:垃圾回收消耗总时间,单位s
*/
jstat -gc pid
2、优化思路
- 观察Eden的使用情况来估计每秒大概新增多少对象,计算对象新增的速率。(不一定是每秒,具体看系统运行情况和负载均衡)
- 计算Young GC的触发频率和每次平均耗时(
YGCT:年轻代垃圾回收消耗时间 / YGC:年轻代垃圾回收次数) - 每次Young GC后有多少对象进入老年代(观察年轻代和老年代内存的变化,每次Young GC之后老年的变化情况)
- Full GC的触发频率和耗时(FGCT:老年代垃圾回收消耗时间 / FGC:老年代垃圾回收次数)
- 每次Young GC之后存活的对象小于Survivor区域的50%,存放在年轻代里。尽量的减少Full GC的频率,避免Full GC对JVM性能的影响
结合具体的案例和对象分配的概念,经过参数的配置来控制Full GC的次数
3、Arthas的使用
- dashboard
- jvm
- 官方文档