一.对于JVM服务可能出现的问题,我们一般依次排查内容为:
(1). 宿主机器问题
(2). JVM内存,是否频繁GC
(3). 线程栈,是否线程暴涨,线程死锁
(4). 排查日志,检查程序代码
解决思路:
1.宿主机问题
top -p ${pid} 内存和cpu使用情况
top -H -p ${pid} 查看进程关联线程情况
2.JVM堆使用情况和GC问题
jmap -heap ${pid} 系统的堆的情况
jmap -histo ${pid} 哪些实例占用内存情况,这个命令一般这样用:jmap -histro 12345|head -n 10
jmap -histo ${pid} | grep ${package} 一般都是具体到包名
jstat -gcutil ${pid} 1000 10 查询每个堆分代的内存占用情况和young GC和Full DC次数和时间。
3.线程栈定位线程问题
4.排查日志,检查程序代码
二.
1.高CPU占用:
最后,总结下排查CPU故障的方法和技巧有哪些:
1、top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。
2、PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
3、jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。
2.高内存问题
最后,总结下排查内存故障的方法和技巧有哪些:
1、top命令:Linux命令。可以查看实时的内存使用情况。
2、jmap -histo:live [pid],然后分析具体的对象数目和占用内存大小,从而定位代码。
3、jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在内存泄漏等等
三.sFull GC的原因:
1.程序执行了System.gc() //建议jvm执行fullgc,并不一定会执行
2.执行了jmap -histo:live pid命令 //这个会立即触发fullgc
3.在执行minor gc的时候进行的一系列检查
4.使用了大对象 //大对象会直接进入老年代
5.在程序中长期持有了对象的引用 //对象年龄达到指定阈值也会进入老年代
补充:java虚拟机常见参数设置:Java虚拟机之常见参数配置_supermao1013的专栏-CSDN博客_java 虚拟机参数
linux中查看文件夹的大小:linux怎么查看一个文件夹的大小_百度知道https://zhidao.baidu.com/question/1178566665695139419.html