这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战
指令
jps
查看java进程和相关信息
jps [options] [hostid]
options:
- -l 显示进程ID,主类名称或jar路径
- -q: 显示进程ID
- -m: 显示进程ID,显示JVM启动时传递给main()的参数
- -v: 显示进程ID, 显示JVM启动时显示指定的JVM
jinfo
查看JVM参数和动态修改部分JVM参数的命令
jinfo [options] pid
options:
- no options 输出所有的系统属性和参数
- -flag name 打印指定名称的参数
- -flag [+|-] name 打开/关闭参数
- -flag name=value 设置参数
- -flags 打印所有参数
- -sysprops 打印系统配置
jstat
查看JVM运行时的状态信息,包括内存状态,垃圾回收等
jstat [option] vmid [interval] [count]
vmid是进程ID, interval是打印间隔时间, count是打印次数,默认一直打印
options:
- class classloader的行为统计
- -compile Hotspot JIT编译器行为
- -gc 垃圾回收堆行为
- -gccapacity 各个垃圾回收代容量和对应空间统计
- -gcutil 垃圾回收概述
- -gccause 垃圾回收概述 附加两次垃圾回收事件的原因
- -gcnew 新生代行为统计
- -gcnewcapacity 新生代和内存空间的统计
- -gcold 老年代行为统计
- -gcoldcapacity 老年代行为和内存空间统计
- -printcompilation Hotspot编译方法统计
jstack
查看线程快照, 定位卡顿原因, 可以查看程序崩溃时生成的core文件的stack信息
jstack [options] pid
options:
- -f 强制输出堆栈消息
- -m 同时输出java堆栈和c/c++堆栈
- -l: 输出堆栈消息, 显示关于锁的附加消息
CPU 占用过高
- 使用Process Explorer工具找到cpu占用率较高的线程
- 在thread卡中找到cpu占用高的线程id
- 线程id转换成16进制
- 使用jstack -l pid查看线程快照
- 线程快照中找到对应线程, 分析代码
jmap
可以生成dump文件,可以查看堆内对象的统计信息, 查看classloader的信息和finalizer队列
jmap [options] pid
options:
-
none 打印目标虚拟机中加载的每个共享对象的起始地址, 映射大小和共享对象文件的路径全称
-
-heap: 打印heap 摘要
-
-histo [:live] 打印堆内的java对象统计信息
-
-clstats: 打印类加载器统计信息
-
-finalizer info 打印在f-queue中等待执行finalizer方法的对象
-
-dump: 生成堆的dump文件
dump-options:
- live: 只转储存活的对象, 如果没有指定转储所有
- format=b 二进制
- file= 文件名
jhat
分析jmap生成的dump文件
jhat [options] [dumpfile]
options:
- -stack false:关闭对象分配调用堆栈的跟踪
- -refs false: 关闭对象引用的跟踪
- -port : HTTP服务器端口,默认7000
- -debug : debug级别
- -version 分析报告版本
工具
jconsole
jdk/bin下直接启动
visualVM
工具-插件-可用插件 安装Visual GC‘
GC日志
参数
GC 参数
| 参数 | 说明 |
|---|---|
| -XX:+PrintGC | 打印简单GC日志 |
| -XX:+PrintGCDetails | 打印详细GC日志 |
| -XX:+PrintGCTimeStamps | 输出GC时间戳 |
| -XX:+PrintGCDateStamps | 输出GC时间戳 |
| -XX:+PrintHeapAtGC | 在GC 前后打印堆的信息 |
| -Xloggc: ../logs/gc.log | 指定输出路径收集日志到日志文件 |
| -XX:+UseGCLogFileRotation | 开启滚动生成日志 |
垃圾收集器
| 参数 | 描述 |
|---|---|
| UseSerialGC | 虚拟机在client模式下的默认值,使用Serial+SerialOld收集器进行内存回收 |
| UseParNewGC | 使用ParNew +Serial Old收集器回收内存 |
| UseConcMarkSweepGC | 使用ParNew +CMS +Serial Old |
| UseParalleloldGC | 使用Parallel Scavenge+Parallel Old的收集器组合 |
| SurvivorRatio | 新生代Eden和任何一个Survivor区域的比值, 默认为8 |
| PretenureSizeThreshold | 直接晋升到老年代对象的大小,单位Byte |
| UseAdaptiveSizePolicy | 动态调整Java堆各区域的大小以及进入老年代的年龄 |
| ParallelGC Threads | 设置并行GC进行内存回收的线程数 |
| GCTime Ratio | GC 时间总比例, 默认99, 只有在PS的时候生效 |
| MaxGCPauseMillis | 设置最大停顿时间, 只在PS生效 |
| CMSInitiationgOccupanycyFraction | CMS在老年代使用多少后触发垃圾收集, 默认68% |
| CMSFullGCsBeforeCompaction | 设置在进行多少次垃圾回收后启动内存碎片整理 |
工具
GCeasy
在线工具