目录
1、JVM调优工具
1.1、jps
1.2、jstat
1.3、jstack
1.4、jinfo
1.5、jmap
2、OOM排查过程
2.1、OOM原因
2.2、OOM发生区域
2.2.1、Java堆溢出:heap
2.2.2、Java栈溢出:stack
2.2.3、运行时常量溢出:constant
2.2.4、方法区溢出:directMemory
2.3、OOM排查流程
3、CPU排查过程
3.1、核心步骤排查
3.2、CPU飙升原因分析
查看Java进程的工具,可获取所需进程的PID,跟Linux下的ps命令类似。
列出正在运行的JVM的PID,以及JVM的执行主类、JVM启动参数等。
显示虚拟机进程中的类装载、内存、垃圾收集等运行数据。
Jstat [option] VMID 打印间隔时间(ms) 打印次数
查看当前Java程序内线程详细堆栈信息的工具,用于生成JVM进程当前时刻的线程的调用堆栈,可以用来定位线程间死锁、锁等待、等待外部资源等。
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
查看JVM参数、动态修改部分JVM参数。
Jinfo [option] pid
用于生成堆转储快照dump文件,常用于分析OOM异常情况。
-dump:生成java堆的dump文件
jhat [option] dumpfile:分析jmap生成的dump文件。
java.lang.OutofMemoryError:Java heap space
原因:内存泄露、JVM内存小、创建太多的对象没有释放。
相关JVM参数:-Xms、-Xmx
java.lang.StackOverflowError,常发生于递归。
java.lang.OutofMemoryError: unable to create new native thread,常发生于创建太多线程。
相关JVM参数:-Xss,表示每个线程的堆栈大小。
java.lang.OutofMemoryError: PermGen space。
运行时常量保存在方法区,存放的主要是编译器生成的各种字面量和符号引用,但是运行期间也可能将新的常量放入池中。
-XX:PermSize:设置持久代(perm gen)初始值,默认值为物理内存的1/64
-XX:MaxPermSize:设置持久代最大值,默认为物理内存的1/4
java.lang.OutofMemoryError: PermGen space。
方法区主要存储被虚拟机加载的类信息,如类名、访问修饰符、常量池、字段描述、方法描述等。目前很多框架,如Spring、Hibernate等会在运行过程中动态生成类,所以方法区也有可能发生OOM。
需要先设置JVM参数,设定当发生OOM的时候自动生成dump出堆信息:
1、先查看应用pid号:ps -ef|grep 应用名/java;
或者使用jps查看JVM中运行的进程状态信息;
2、查看pid垃圾回收情况:jstat -gc pid 5000(时间间隔)
查看堆内存各部分的使用量,加载类的数量以及GC的情况
3、使用jmap -histo:live pid 显示堆中的详细信息
4、使用jmap -dump:format=b,file=heapdump.phrof pid生成堆存储快照,然后将快照文件使用jvisualvm进行分析;
以上内容为个人学习理解,如有问题,欢迎在评论区指出。
部分内容截取自网络,如有侵权,联系作者删除。