1 jps
功能描述:jps 全称 JVM Process Status Tool,命令位于 jdk 的 bin 目录下,其作用是显示当前系统的 Java 进程情况,及其 pid 号。他是 Java自带的一个命令。
code:
public class Simple {
public static void main(String[] args) {
while (true){
}
}
}
-q:仅仅显示 LVMID (local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等。
-l:输出应用程序主类的全类名或如果进程执行的是jar包,则输出jar完整路径
-m:输出虚拟机进程启动时传递给主类main()的参教
-v: 列出jvm参数, -Xms20m -Xmx50m是启动程序指定的jvm参数。
设置启动参数:-Xms100m -Xms100m
以上参数可以综合使用:
2 jstat
jstat(Java Virtual Machine statistics monitoring tool)它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。
它的基本使用语法为:
#jstat
#-t: 在输出信息前加上一个Timestamp列,显示程序的运行时间。单位:秒。
#-h: 可以在周明性数据輸出时,输出多少行数据后輸出一个表头信息
#vmid: java进程ID
#-interval: 用于指定输出统计数据的周期,单位为毫秒,即:查识间隔
#-count:用于指定查询的总次数
jstat -<option> [-t] [-h<lines>] <vmid> [<interval>[<count>]]
选项 option可以由以下值构成:
类装载相关的:
-class:显示ClassLoader的相关信息:类的装载、卸载数量、总空间类装载所消耗的时间等
垃圾回收相关的:
-gc:显示与GC相关的堆信息。包括Eden区、两个 Survivor区、老年代永久代等的容量、早用空间、GC时间合计等信息。
-capacity:显示内容与-gc基本相同,但输出主要关注]ava堆各个区域使用到的最大、最小空间。
-gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
-gccause:与-gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因 。
-gcnew:显示新生代GC状况。
-gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间。
-gold:显示老年代GC状况
2.1 code
public class Simple {
/**
* VM options: -Xms100m -Xms100m
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String info = scanner.next();
}
}
2.2 类装载
显示ClassLoader的相关信息:类的装载、卸载数量、总空间类装载所消耗的时间等
1秒打印一次,打印5次:
#-interval: 用于指定输出统计数据的周期,单位为毫秒,即:查识间隔
#-count:用于指定查询的总次数
#-t: 在输出信息前加上一个Timestamp列,显示程序的运行时间。单位:秒。
#-h: 可以在周明性数据輸出时,输出多少行数据后輸出一个表头信
jstat -class -t -h2 6928 1000 10
2.2 垃圾回收
#-gc:显示与GC相关的堆信息。包括Eden区、两个 Survivor区、老年代永久代等的容量、早用空间、GC时间合计等信息。
jstat -gc 6928
s0总容量、S1总容量、S0使用容量、S1使用容量、Eden总容量、Eden使用容量、Old总容量、Old使用容量、方法区总容量、方法区使用容量、压缩类总容量、压缩类使用容量、YongGC次数、YongGC花费时间、FullGC次数、FullGC花费时间、GC总花费时间
code:
public class GCTest {
/**
* VM options:-Xms60m -Xmx60m
*/
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
for (int i = 1; i <= 1000; i++) {
//100KB
byte[] arr = new byte[1024 * 100];
list.add(arr);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
#-gcutil查看OOM
jstat -gcutil 12464 1000 30
3 jmap
jmap (JVM Memory Map):作用一方面是获取dump文件(堆转储快照文件、二进制文件)它还可以获取目标Java进程的内存相关信息,包括]ava堆各区域的使用情况、堆中对象的统计信息.、类加载信息等。
它的基本使用语法为:
jmap [option] <pid>
jmap [option] <executable <core>>
jmap [option] [server_id@]<remote server IP or hostname>
其中option包括:
导出内存映射文件:
一般来说,使用jmap指令生成dump文件的操作算得上是最常用的jmap命令之一,将堆中所有存活对象导出至一个文件之中。
说明:
(1)通常在写 Heap Dump 文件前会触发一次Full GC,所以 heap dump文件里保存的都是FullGC后留下的对象信息。
(2)由于生成dump文件比较耗时,因此大家需要耐心等待,尤其是大内存镜像生成dump文件则需要耗费更长的时间来完成。
3.1 手动的方式
jmap -dump:format=b,file=<filename,hprof> <pid>
#live 只保存堆中存活的对象
jmap -dump:live,format=b,file=<filename,hprof> <pid>
code:
/**
* VM options:-Xms60m -Xmx60m
*/
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
for (int i = 1; i <= 1000; i++) {
//100KB
byte[] arr = new byte[1024 * 100];
list.add(arr);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
#命令
jmap -dump:format=b,file=d:\temp.hprof 17788
jmap -dump:live,format=b,file=d:\temp_live.hprof 17788
3.2 自动方式
当程序发生OOM退出系统时,一些瞬时信息都随着程序的终止而消失,而重现OOM问题往往比较困难或者耗时。此时若能在OOM时,自动导出dump文件就显得非常迫切。
获取快照文件的方法:
-XX:+HeapDumpOnOutOfMemoryError:在程序发生OOM时,导出应用程序的当前堆快照。
-XX:HeapDumpPath:可以指定堆快照的保存位置。
例如:
-Xms60m -Xmx60m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\temp_oom.hprof
修改VM参数: