JVM虚拟机调优实战(2)基础调优篇

jps命令

解释:查看Java开启的进程

查看进程:jps -l

Jinfo 命令

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

查看jvm的参数 :Jinfo -flags [进程数]
在这里插入图片描述
查看java系统参数:jinfo -sysprops [进程数]
在这里插入图片描述

Jstat 命令

解释:jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。
注意:使用的jdk版本是jdk8.


类加载统计:jstat -class [进程数]
在这里插入图片描述
Loaded:加载class的数量
Bytes:所占用空间大小
Unloaded:未加载数量
Bytes:未加载占用空间
Time:时间


垃圾回收统计: jstat -gc [进程数]
在这里插入图片描述
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小(元空间)
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间


堆内存统计:jstat -gccapacity [进程数]
在这里插入图片描述
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数


新生代垃圾回收统计:jstat -gcnew [进程数]
在这里插入图片描述
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间


新生代内存统计:jstat -gcnewcapacity [进程数]
在这里插入图片描述
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0CMX:最大幸存1区大小
S0C:当前幸存1区大小
S1CMX:最大幸存2区大小
S1C:当前幸存2区大小
ECMX:最大伊甸园区大小
EC:当前伊甸园区大小
YGC:年轻代垃圾回收次数
FGC:老年代回收次数


老年代垃圾回收统计:jstat -gcold [进程数]
在这里插入图片描述
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间


老年代内存统计jstat -gcoldcapacity [进程数]

在这里插入图片描述
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间


元数据空间统计: jstat -gcmetacapacity [进程数]
在这里插入图片描述
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

元数据空间统计: jstat -gcutil [进程数]
在这里插入图片描述
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

Jmap命令(面试常问)

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


实例个数以及占用内存大小:jmap -histo [进程数] > [输出文件地址]
在这里插入图片描述
打开log.txt,文件内容如下:
在这里插入图片描述
num:序号
instances:实例数量
bytes:占用空间大小
class name:类名称


堆信息:jmap -heap [进程数]
解释:打印堆的一个整体概况
在这里插入图片描述


堆内存dump:jmap -dump:format=b,file=[输出文件名] [进程数]
在这里插入图片描述

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./ (路径)
这两个参数的意思是:如超过设定的内存阈值(内存溢出)会自动导出dump文件(内存很大的时候,可能会导不出来)

在用jvisualvm命令工具导入该dump文件分析(方法:右击文件,装入)
在这里插入图片描述


Jstack命令(面试常问)

解释:jstack查找死锁问题

示例:死锁代码

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");
	}
}

代码解释:线程一将lock1锁住,线程二将lock2锁住,导致线程一去拿lock2去锁(线程二拿lock1去锁)的时候造成了死锁。


检查死锁位置命令:jstack [进程数]
在这里插入图片描述


或者直接使用jvisualvm命令,打开可视化界面
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41133245/article/details/108950192