?作为Java开发人员,我们肯定知道JDK的bin目录下有"java.exe"、"javac.exe"这两个命令工具 , 这也是我们平时用得最多的工具 。但其实bin目录下还有很多工具,这些工具可以帮助我们进行JVM的调优,帮我们定位找出应用程序运行中产生的问题 。下面我们来看看其中一些调优工具 。
前置启动程序?先启动一个web应用程序,然后用各种JDK自带命令优化应用 。
jpsjps
?用jps查看应用进行ID
文章插图
jinfo
jinfo -flags 92604
?此命令可以实时查看和调整虚拟机各项参数 。文章插图
jmap?此命令可以用来查看内存信息,实例个数以及占用大小 , 还可以生成堆转储快照 。
文章插图
jmap -histo 14660#查看历史生成的实例jmap -histo:live 14660#查看当前存活的实例,执行过程中可能会触发一次full gc
打开log.txt,内容如下:文章插图
- 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
文章插图
转储堆内存dump
jmap -dump:format=b,file=web.hprof 92604
文章插图
也可以设置内存溢出自动导出dump文件(内存很大的时候 , 可能会导不出来)
- -XX:+HeapDumpOnOutOfMemoryError
- -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对象实例数名列前茅 。
文章插图
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");}}
jstack 100516
文章插图
"Thread-1":线程名
prio=5: java线程优先级
os_prio:操作系统线程优先级
nid=0x18688 线程对应的本地线程标识nid
java.lang.Thread.State: BLOCKED 线程状态
文章插图
【JVM调优工具使用手册】还可以用jvisualvm自动检测到死锁 。
文章插图
找出占用cpu最高的线程堆栈信息
public class Math {public static final int initData = https://www.huyubaike.com/biancheng/666;public static User user = new User();public int compute() {//一个方法对应一块栈帧内存区域int a = 1;int b = 2;int c = (a + b) * 10;return c;}public static void main(String[] args) {Math math = new Math();while (true){math.compute();}}}
1,使用命令top -p,显示你的java进程的内存情况,pid是你的java进程号,比如18963
推荐阅读
- JVM运行时数据区域详解
- 要写文档了,emmm,先写个文档工具吧——DocMarkdown
- JVM学习笔记——内存模型篇
- jvm双亲委派机制详解
- chrome工具调试
- 万字详解JVM,让你一文吃透
- 怎么破解DLL文件(dll文件反编译工具)
- JVM学习笔记——类加载和字节码技术篇
- 重新整理 .net core 实践篇 ———— linux上排查问题实用工具 [外篇]
- 详细了解JVM运行时内存