JVM-03 JVM性能调优监控工具

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31463999/article/details/87931928

1.Jinfo

查看正在运行的Java应用程序的扩展参数

1.1 查看jvm的参数

运行一个jar程序jps查看下进程号
在这里插入图片描述

1.2 查看java系统参数

在这里插入图片描述

2.Jstat

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:

jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]

注意:使用的jdk版本是jdk8.
在这里插入图片描述

2.1 类加载统计

jstat -class 10616

在这里插入图片描述

  • Loaded:加载class的数量
  • Bytes:所占用空间大小
  • Unloaded:未加载数量
  • Bytes:未加载占用空间
  • Time:时间

2.2 垃圾回收统计

jstat -gc 10616

在这里插入图片描述

  • S0C:第一个幸存区的大小
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法区大小(元空间)
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

2.3 堆内存统计

jstat -gccapacity 10616

在这里插入图片描述

  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0C:第一个幸存区大小
  • S1C:第二个幸存区的大小
  • EC:伊甸园区的大小
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:当前老年代大小
  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:年轻代gc次数
  • FGC:老年代GC次数

2.4 新生代垃圾回收统计

jstat -gcnew 10616

在这里插入图片描述

  • S0C:第一个幸存区的大小
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • TT:对象在新生代存活的次数
  • MTT:对象在新生代存活的最大次数
  • DSS:期望的幸存区大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间

2.5 新生代内存统计

jstat -gcnewcapacity 10616

在这里插入图片描述

  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0CMX:最大幸存1区大小
  • S0C:当前幸存1区大小
  • S1CMX:最大幸存2区大小
  • S1C:当前幸存2区大小
  • ECMX:最大伊甸园区大小
  • EC:当前伊甸园区大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代回收次数

2.6 老年代垃圾回收统计

jstat -gcold 10616

在这里插入图片描述

  • MC:方法区大小
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

2.7 老年代内存统计

jstat -gcoldcapacity 10616

在这里插入图片描述

  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:老年代大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

2.8 元数据空间统计

jstat -gcmetacapacity 10616

在这里插入图片描述

  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

2.9 gc工具

jstat -gcutil 10616

在这里插入图片描述

  • S0:幸存1区当前使用比例
  • S1:幸存2区当前使用比例
  • E:伊甸园区使用比例
  • O:老年代使用比例
  • M:元数据区使用比例
  • CCS:压缩使用比例
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

3.Jmap

此命令可以用来查看内存信息。

3.1 实例个数以及占用内存大小

jmap -histo 10616 > /iotcloud/log.txt

在这里插入图片描述

  • num:序号
  • instances:实例数量
  • bytes:占用空间大小
  • class name:类名称

3.2 堆信息(mac报错)

在这里插入图片描述

3.3 堆内存dump

jmap -dump:format=b,file=/iotcloud/test.hprof 11264

也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./   (路径)

可视化平台

jvisualvm

在这里插入图片描述

3.3.1 内存溢出示例

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 描述:内存溢出测试
 * @author: myx
 * @date: 2019/1/20
 * Copyright © 2018-hotpot. All rights reserved.
 */
public class OOMTest {
	// JVM设置    
	// -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/iotcloud/jvm.dump 
	public static void main(String[] args) {
		List<Object> list = new ArrayList<>();
		int i = 0;
		while (true) {
			list.add(new User(i++, UUID.randomUUID().toString()));
		}
	}
}

在这里插入图片描述

运行代码

在这里插入图片描述
导入dump文件

在这里插入图片描述

3.3.2 远程连接jvisualvm

  • 启动普通的jar程序JMX端口配置:
java  -Djava.rmi.server.hostname=10.1.202.28 -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar foo.jar
  • tomcat的JMX配置
JAVA_OPTS=-Djava.rmi.server.hostname=10.1.202.28 -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

jvisualvm远程连接服务需要在远程服务器上配置host(连接ip 主机名),并且要关闭防火墙

4.Jstack

排查死锁

jstack 11264

在这里插入图片描述

4.1 用jstack查找死锁(也可以用jvisualvm查看死锁)

/**
 * 描述:死锁示例
 * @author: myx
 * @date: 2019/1/20
 * Copyright © 2018-hotpot. All rights reserved.
 */
public class DeadLockTest {

	private static Object lock1 = new Object();
	private static Object lock2 = new Object();

	public static void main(String[] args) {
		new Thread(() -> {
			synchronized (lock1) {
				try {
					System.out.println("thread1 begin");
					Thread.sleep(5000);
				} catch (InterruptedException e) {
				}
				synchronized (lock2) {
					System.out.println("thread1 end");
				}
			}
		}).start();

		new Thread(() -> {
			synchronized (lock2) {
				try {
					System.out.println("thread2 begin");
					Thread.sleep(5000);
				} catch (InterruptedException e) {
				}
				synchronized (lock1) {
					System.out.println("thread2 end");
				}
			}
		}).start();

		System.out.println("main thread end");
	}
}

在这里插入图片描述

在这里插入图片描述
jvisualvm查看死锁

在这里插入图片描述

4.2 jstack找出占用cpu最高的堆栈信息

  1. 使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如4977
  2. 按H,获取每个线程的内存情况
  3. 找到内存和cpu占用最高的线程tid,比如4977
  4. 转为十六进制得到 0x1371 ,此为线程id的十六进制表示
  5. 执行 jstack 4977|grep -A 10 1371,得到线程堆栈信息中1371这个线程所在行的后面10行
  6. 查看对应的堆栈信息找出可能存在问题的代码

更多JVM相关知识请参考目录JVM学习目录

猜你喜欢

转载自blog.csdn.net/qq_31463999/article/details/87931928