JVM调优工具使用手册

?作为Java开发人员 , 我们肯定知道JDK的bin目录下有"java.exe"、"javac.exe"这两个命令工具 , 这也是我们平时用得最多的工具 。但其实bin目录下还有很多工具 , 这些工具可以帮助我们进行JVM的调优 , 帮我们定位找出应用程序运行中产生的问题 。下面我们来看看其中一些调优工具 。
前置启动程序?先启动一个web应用程序 , 然后用各种JDK自带命令优化应用 。
jpsjps?用jps查看应用进行ID

JVM调优工具使用手册

文章插图
jinfojinfo -flags 92604?此命令可以实时查看和调整虚拟机各项参数 。
JVM调优工具使用手册

文章插图
jmap?此命令可以用来查看内存信息 , 实例个数以及占用大小 , 还可以生成堆转储快照 。
JVM调优工具使用手册

文章插图
jmap -histo 14660#查看历史生成的实例jmap -histo:live 14660#查看当前存活的实例 , 执行过程中可能会触发一次full gc打开log.txt , 内容如下:
JVM调优工具使用手册

文章插图
  • num:序号
  • instances:实例数量
  • bytes:占用空间大小
  • class name:类名称 , [C is a char[] , [S is a short[] , [I is a int[] , [B is a byte[] , [[I is a int[][]
堆信息?可以查看当前应用的堆具体配置、使用信息 。
jmap -heap 92604
JVM调优工具使用手册

文章插图
转储堆内存dumpjmap -dump:format=b,file=web.hprof 92604
JVM调优工具使用手册

文章插图
也可以设置内存溢出自动导出dump文件(内存很大的时候 , 可能会导不出来)
  1. -XX:+HeapDumpOnOutOfMemoryError
  2. -XX:HeapDumpPath=./(路径)
示例代码:
public class OOMTest {public static List<Object> list = new ArrayList<>();// JVM设置    // -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\jvm.dumppublic static void main(String[] args) {List<Object> list = new ArrayList<>();int i = 0;int j = 0;while (true) {list.add(new User(i++, UUID.randomUUID().toString()));}}}jvisualvmjvisualvm?该命令可以打开一个可视化界面 , 监视当前运行应用程序、dump文件进行故障分析等功能 。
?导入上面示例代码运行后产生的hprof文件 , 可以看到User对象实例数名列前茅 。
JVM调优工具使用手册

文章插图
jstack?此命令可以用来跟踪Java堆栈信息 。用于生成虚拟机当前试课的线程快照 。快照可以定位线程出现长时间停顿的原因 , 如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因 。
死锁示例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");}}

经验总结扩展阅读