java内存及线程问题排查常用命令

0. 观察进程的上下文切换

vmstat 1 3
代表每秒收集一次性能指标,总共获取3次
procs
r:等待运行的进程数
b:处于非中断睡眠状态的进程数
memory
swpd:虚拟内存使用情况
free:空闲的内存
buff:用来作为缓冲的内存数
cache:缓存大小
swap
si:从磁盘交换到内存的交换页数量
so:从内存交换到磁盘的交换页数量
io
bi:发送到块设备的块数
bo:从块设备接收到的块数
system
in:每秒中断数
cs:每秒上下文切换次数
cpu
us:用户CPU使用时间
sy:内核CPU系统使用时间
id:空闲时间
wa:等待I/O时间
st:运行虚拟机窃取的时间

1. 监测该进程的内存使用情况

pidstat -p 31759 -r 1 3
其中pidstat的参数-p用于指定进程ID,-r表示监控内存的使用情况,1表示每秒的意思,3则表示采样次数。

Minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载页;
Majflt/s:任务每秒发生的主要错误,需要从磁盘中加载页;
VSZ:虚拟地址大小,虚拟内存使用KB;
RSS:常驻集合大小,非交换区内存使用KB。

2. jstat 监测Java应用程序的实时运行情况

参数
-class:显示ClassLoad的相关信息;
-compiler:显示JIT编译的相关信息;
-gc:显示和gc相关的堆信息;
-gccapacity:显示各个代的容量以及使用情况;
-gcmetacapacity:显示Metaspace的大小;
-gcnew:显示新生代信息;
-gcnewcapacity:显示新生代大小和使用情况;
-gcold:显示老年代和永久代的信息;
-gcoldcapacity :显示老年代的大小;
-gcutil:显示垃圾收集信息;
-gccause:显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;
-printcompilation:输出JIT编译的方法信息。

例:jstat -gc 31759
S0C:年轻代中To Survivor的容量(单位KB);
S1C:年轻代中From Survivor的容量(单位KB);
S0U:年轻代中To Survivor目前已使用空间(单位KB);
S1U:年轻代中From Survivor目前已使用空间(单位KB);
EC:年轻代中Eden的容量(单位KB);
EU:年轻代中Eden目前已使用空间(单位KB);
OC:Old代的容量(单位KB);
OU:Old代目前已使用空间(单位KB);
MC:Metaspace的容量(单位KB);
MU:Metaspace目前已使用空间(单位KB);
YGC:从应用程序启动到采样时年轻代中gc次数;
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s);
FGC:从应用程序启动到采样时old代(全gc)gc次数;
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s);
GCT:从应用程序启动到采样时gc用的总时间(s)。

3. jstack 线程堆栈分析工具

        使用 在线线程分析

 jstack -l 14096 >/mnt/data/thread.txt

4. jmap查看堆内存初始化配置信息以及堆内存的使用情况

jmap -heap 31759
#查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象
jmap -histo:live 31759 | more
#导出并使用jvisualvm和mat分析
jmap -dump:format=b,file=heap.hprof 31759

5. GC日志

        在线分析

        gcviewer分析

         gceasy分析 ​​​​​​  ​​​​​​

#开启参数
-XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gclogs

一个垃圾收集器在不同场景下表现出的性能也不一样,那么如何评价一个垃圾收集器的性能好坏呢?我们可以借助一些指标。

吞吐量:这里的吞吐量是指应用程序所花费的时间和系统总运行时间的比值。我们可以按照这个公式来计算GC的吞吐量:系统总运行时间=应用程序耗时+GC耗时。如果系统运行了100分钟,GC耗时1分钟,则系统吞吐量为99%。GC的吞吐量一般不能低于95%。

停顿时间:指垃圾收集器正在运行时,应用程序的暂停时间。对于串行回收器而言,停顿时间可能会比较长;而使用并发回收器,由于垃圾收集器和应用程序交替运行,程序的停顿时间就会变短,但其效率很可能不如独占垃圾收集器,系统的吞吐量也很可能会降低。

垃圾回收频率:多久发生一次指垃圾回收呢?通常垃圾回收的频率越低越好,增大堆内存空间可以有效降低垃圾回收发生的频率,但同时也意味着堆积的回收对象越多,最终也会增加回收时的停顿时间。所以我们只要适当地增大堆内存空间,保证正常的垃圾回收频率即可

5. jinfo查看jvm运行参数

示例一: no option
命令:jinfo pid
描述:输出当前 jvm 进程的全部参数和系统属性

示例二: -flag name
命令:jinfo -flag name pid
描述:输出对应名称的参数
使用该命令,可以查看指定的 jvm 参数的值。如:查看当前 jvm 进程是否开启打印 GC 日志。
例:jinfo -flag XX:PretenureSizeThreshold  16410

示例三:-flag [+|-]name
命令:jinfo -flag [+|-]name pid
描述:开启或者关闭对应名称的参数
使用 jinfo 可以在不重启虚拟机的情况下,可以动态的修改 jvm 的参数。尤其在线上的环境特别有用。
例:jinfo -flag +PrintGC 5283

示例四:-flag name=value
命令:jinfo -flag name=value pid
描述:修改指定参数的值。
同示例三,但示例三主要是针对 boolean 值的参数设置的。如果是设置 value值,则需要使用 name=value 的形式。

示例五: -flags
命令:jinfo -flags pid
描述:输出全部的参数

示例六:-sysprops
命令:jinfo -sysprops pid
描述:输出当前 jvm 进行的全部的系统属性

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值