java oom 分析

jps

  • -l : 输出主类全名或jar路径

  • -q : 只输出LVMID

  • -m : 输出JVM启动时传递给main()的参数

  • -v : 输出JVM启动时显示指定的JVM参数

  • jps -l

PS D:\Program Files\Java\jdk1.8.0_251\bin> .\jps -l
12216 sun.tools.jps.Jps
1452 xinyue-0.0.1-SNAPSHOT.jar
  • jps -v
PS D:\Program Files\Java\jdk1.8.0_251\bin> .\jps -v
14500 Jps -Dapplication.home=D:\Program Files\Java\jdk1.8.0_251 -Xms8m
1452 jar
PS D:\Program Files\Java\jdk1.8.0_251\bin>
  • jps -m
PS D:\Program Files\Java\jdk1.8.0_251\bin> .\jps -m
2736 Jps -m
1452 jar	

jinfo

用来查看jvm参数和动态修改部分jvm参数的命令,一般没什么卵用。
options参数解释:

  • -flag 打印指定名称的参数
  • -flag [+|-] 打开或关闭参数
  • -flag = 设置参数
  • -flags 打印所有参数 // 主要是jvm相关的配置参数各种内存啥的
  • -sysprops 打印系统配置
  • no option 打印上面两个选项

jstack

排查流程如下

  1. top(输入大写P以cpu从大到小排序,大写M内存大小排序)
  2. 通过top找到pid,通过 top -H -p pid列出该线程下的所有线程id,找到cpu或者内存使用最高的线程id
  3. printf “%x\n” tid 比如:1ab4f
  4. 使用jstack pid(java进程id)|grep 1ab4f
  5. 成功找到线程信息
[root@eva-report-deploy-online-ihaql-86cf9d9579-4bz8z eva_report]# printf "%x\n" 6538
198a
[root@eva-report-deploy-online-ihaql-86cf9d9579-4bz8z eva_report]# jps
5290 Jps
11 eva_report-1.0.0-SNAPSHOT.jar
[root@eva-report-deploy-online-ihaql-86cf9d9579-4bz8z eva_report]# jstack 11 |grep 198a
"http-nio-8080-exec-72" #6456 daemon prio=5 os_prio=0 tid=0x00007fb05c03d800 nid=0x198a waiting on condition [0x00007faf819d8000]

jstat(重要)

查看jvm运行时的状态信息,包括内存状态,垃圾回收等。
jstat [option] LVMID [interval] [count]
option参数解释:

  • -class class loader的行为统计
  • -compiler HotSpt JIT编译器行为统计
  • -gc 垃圾回收堆的行为统计
  • -gccapacity 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计
  • -gcutil 垃圾回收统计概述
  • -gccause 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
  • -gcnew 新生代行为统计
  • -gcnewcapacity 新生代与其相应的内存空间的统计
  • -gcold 年老代和永生代行为统计
  • -gcoldcapacity 年老代行为统计
  • -gcpermcapacity 永生代行为统计
  • -printcompilation HotSpot编译方法统计

常用组合
jstat -gcutil -h 10 pid 3s 100
解释:10次打印一次head头,3秒刷新一次刷新100次
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
字段解释:

  • S0 survivor0使用百分比
  • S1 survivor1使用百分比
  • E Eden区使用百分比
  • O 老年代使用百分比
  • M 元数据区使用百分比
  • CCS 压缩使用百分比
  • YGC 年轻代垃圾回收次数
  • YGCT 年轻代垃圾回收消耗时间
  • FGC 老年代垃圾回收次数
  • FGCT 老年代垃圾回收消耗时间
  • GCT 垃圾回收消耗总时间

-gc和-gcutil类似只不过输出字段不是百分比而是实际的值
-gc
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
字段解释:

  • S0C survivor0大小
  • S1C survivor1大小
  • S0U survivor0已使用大小
  • S1U survivor1已使用大小
  • EC Eden区大小
  • EU Eden区已使用大小
  • OC 老年代大小
  • OU 老年代已使用大小
  • MC 方法区大小
  • MU 方法区已使用大小
  • CCSC 压缩类空间大小
  • CCSU 压缩类空间已使用大小
  • YGC 年轻代垃圾回收次数
  • YGCT 年轻代垃圾回收消耗时间
  • FGC 老年代垃圾回收次数
  • FGCT 老年代垃圾回收消耗时间
  • GCT 垃圾回收消耗总时间

堆外内存分析

  1. jvm参数中加入 ** -XX:NativeMemoryTracking=[off | summary | detail]**,summary是概要,detail是详细
-XX:NativeMemoryTracking=detail
  1. 使用jcmd pid VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]
jcmd pid VM.native_memory detail scale=MB

以此可以查看堆外内存的详细使用情况

jmap

jmap是用来生成堆dump文件和查看堆相关的各类信息的命令

  • jmap [option] (连接正在执行的进程)
  • jmap [option] <executable (连接一个core文件)
  • jmap [option] [server_id@] (链接远程服务器)
    option参数解释:

to print same info as Solaris pmap

  • -heap 打印java heap摘要

  • -histo[:live] 打印堆中的java对象统计信息

  • -clstats 打印类加载器统计信息

  • -finalizerinfo 打印在f-queue中等待执行finalizer方法的对象

  • -dump: 生成java堆的dump文件
          dump-options:
          live 只转储存活的对象,如果没有指定则转储所有对象
          format=b 二进制格式
          file= 转储文件到

  • -F 强制选项

常用示例

  • 查看堆内存使用情况
jmap -heap pid

Attaching to process ID 11666, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.25-b02

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration: //堆内存初始化配置
   MinHeapFreeRatio         = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
   MaxHeapFreeRatio         = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
   MaxHeapSize              = 1073741824 (1024.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
   NewSize                  = 22020096 (21.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的新生代的默认大小
   MaxNewSize               = 357564416 (341.0MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的新生代的最大大小
   OldSize                  = 45088768 (43.0MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的老年代的大小
   NewRatio                 = 2 //对应jvm启动参数-XX:NewRatio=:新生代和老生代的大小比率
   SurvivorRatio            = 8 //对应jvm启动参数-XX:SurvivorRatio=设置新生代中Eden区与Survivor区的大小比值
   MetaspaceSize            = 21807104 (20.796875MB) // 元数据区大小
   CompressedClassSpaceSize = 1073741824 (1024.0MB) //类压缩空间大小
   MaxMetaspaceSize         = 17592186044415 MB //元数据区最大大小
   G1HeapRegionSize         = 0 (0.0MB) //G1垃圾收集器每个Region大小

Heap Usage: //堆内存使用情况
PS Young Generation 
Eden Space: //Eden区内存分布
   capacity = 17825792 (17.0MB) //Eden区总容量
   used     = 12704088 (12.115562438964844MB) //Eden区已使用
   free     = 5121704 (4.884437561035156MB) //Eden区剩余容量
   71.26801434685203% used //Eden区使用比率
From Space: //其中一个Survivor区的内存分布
   capacity = 2097152 (2.0MB)
   used     = 1703936 (1.625MB)
   free     = 393216 (0.375MB)
   81.25% used
To Space: //另一个Survivor区的内存分布
   capacity = 2097152 (2.0MB)
   used     = 0 (0.0MB)
   free     = 2097152 (2.0MB)
   0.0% used
PS Old Generation
   capacity = 52428800 (50.0MB) //老年代容量
   used     = 28325712 (27.013504028320312MB) //老年代已使用
   free     = 24103088 (22.986495971679688MB) //老年代空闲
   54.027008056640625% used //老年代使用比率

15884 interned Strings occupying 2075304 bytes.
  • 当前堆内活跃对象输出到文件
jmap -dump:live,format=b,file=dump.hprof 11666
  • 输出等待finalizer方法的对象
jmap -finalizerinfo pid

Attaching to process ID 11666, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01
Number of objects pending for finalization: 0
  • 输出存活对象统计信息
jmap -histo:live 11666 | more

num     #instances         #bytes  class name
----------------------------------------------
1:         46608        1111232  java.lang.String
2:          6919         734516  java.lang.Class
3:          4787         536164  java.net.SocksSocketImpl
4:         15935         497100  java.util.concurrent.ConcurrentHashMap$Node
5:         28561         436016  java.lang.Object
  • jhat
    jhat [option] [dumpfile]

option参数解释:

  • -stack false: 关闭对象分配调用堆栈的跟踪
  • -refs false: 关闭对象引用的跟踪
  • -port : HTTP服务器端口,默认是7000
  • -debug : debug级别

常用示例:
jhat dump.hprof

jcmd

java进程锁涉及的基本类,线程和VM信息

jcmd process_id command optional_arguments

  • 查看jvm运行时长
    jcmd process_id VM.uptime

  • 系统属性包括通过命令行-D设置的所有属性

jcmd process_id VM.system_properties
jinfo -sysprops process_id

  • jvm版本

jcmd process_id VM.version

  • jvm命令行,显示程序所用命令行

jcmd process_id VM.command_line

1:
VM Arguments:
jvm_args: -Xms512m -Xmx512m -XX:MetaspaceSize=400m -XX:MaxMetaspaceSize=400m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -Xloggc:/gc.log -XX:NumberOfGCLogFiles=3 -XX:GCLogFileSize=1m -Dfile.encoding=UTF-8 -XX:NativeMemoryTracking=summary 
java_command: ./target/eva_report-1.0.0-SNAPSHOT.jar --spring.profiles.active=dev
java_class_path (initial): ./target/eva_report-1.0.0-SNAPSHOT.jar
Launcher Type: SUN_STANDARD

arthas

官网 : https://arthas.aliyun.com/doc/install-detail.html

  • 安装

curl -O https://arthas.aliyun.com/arthas-boot.jar

  • 启动

java -jar arthas-boot.jar

  • dashboard
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值