【JVM】OOM与调优(二)

OOM与调优

6.JVM工具如jps

该命令是纯Java编写的
在这里插入图片描述

-q:只显示Java进程的ID

在这里插入图片描述

-m:输出Java进程的ID + main函数所在类的名字 + 传递给main函数的参数
在这里插入图片描述

-l:输出Java进程的ID+main函数所在类的全限定名(包名+类名)
在这里插入图片描述

-v:输出Java进程的ID+main函数所在类的名称+传递给JVM的参数
应用:可以通过次方式快速查看JVM参数是否设置成功

jps源码的位置

在这里插入图片描述

/openjdk/jdk/src/share/classes/sun/tools/jps

如何识别的Java进程?jps输出的信息全是Java进程的信息,是如何做到的?

Java进程在创建的时候,会生成相应的文件,进程相关的信息会写入该文件中。Windows下默认路径是:
在这里插入图片描述

C:\Users\username\AppData\Local\Temp\hsperfdata_username

Ubuntu环境下,它的路径是

/tmp/hsperfdata_username

在这里插入图片描述

PerfData文件

  • 1.文件创建
    每启动一个Java进程,/tmp/hsperfdata_username就会生成进程号的一个文件,这个文件是一个内存映射文件。有时候不会生成,受参数的影响,
    -XX:-/+UsePerfData默认是开启的,它是通过attach到Java进程中去,它属于寄生在Java进程当中,可以读取Java进程的内存。
    -XX:-/+PerfDisableSharedMem(禁用共享内存)默认是关闭的,即支持内存共享。如果禁用了,依赖于PerfData文件的工具就无法正常进行了
  • 2.文件删除
    正常情况下:默认情况下随Java进程的结束而销毁
    非正常退出:下一次去读目录的时候会检测进程是否存在, 用kill -0 去检测进程是否存活,不存货就会删除该进程号文件,不然就会留下垃圾文件
  • 3.文件更新
    -XX:PerfDataSamplingInterval=50,即内存与PerfData文件的数据延迟为50ms

查看PerfData参数
在这里插入图片描述

7.JVM异常退出

在这里插入图片描述

  • OOM killer
    dmesg -T 日志查看内核日志
  • 堆OOM
    会生成日志,分配内存new的执行流程
  • 元空间OOM
    会生成日志,解析类、类加载器、动态字节码 cglib
  • 直接内存OOM
    unsafe bytbuffer
    都不会生成日志,JVM进程的堆(OS知道)
  • 栈OOM,为什么没有听说过这个地方发生OOM
    开发阶段就会知道栈帧是否会发生OOM了

CPU占用过高如何排查?

  • 1.定位到占用CPU最高的进程
  • 2.定位到目前占用CPU最高的线程ID
top -H -p pid

将线程ID由十进制转换为十六进制

  • 3.定位线程
jstack pid | grep 十六进制线程id -A 30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coffee_babe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值