JVM调优有哪些工具?
2 个回答
纵然前路迷茫,纵然天隔一方,纵然我手中的刀刃已然破碎,也无法阻挡我寻找你的道路。小洋### JVM调优工具 #### jstat `jstat` 可以打印出当前 JVM 运行的各种状态信息,例如新生代内存使用情况,老年代内存使用情况,以及垃圾回收的时间。它可以监测 Minor GC 和 Full GC 的发生次数和总耗时。使用 `jmap -heap` 命令也可以打印出堆中各个分区的内存使用情况,但无法定时监测和持续打印。 ```java // 5828 是 java 进程 id,1000 是打印间隔,每 1000 毫秒打印一次,100 是总共打印 100 次 jstat -gc 5828 1000 100 ``` 打印结果示例:  各个参数的含义如下: - **S0C**:新生代中第一个 Survivor(幸存区)的总容量(字节) - **S1C**:新生代中第二个 Survivor(幸存区)的总容量(字节) - **S0U**:新生代中第一个 Survivor(幸存区)目前已使用空间(字节) - **S1U**:新生代中第二个 Survivor(幸存区)目前已使用空间(字节) - **EC**:新生代中 Eden 区的总容量(字节) - **EU**:新生代中 Eden 区目前已使用空间(字节) - **OC**:老年代的总容量(字节) - **OU**:老年代目前已使用空间(字节) - **YGC**:目前新生代垃圾回收总次数 - **YGCT**:目前新生代垃圾回收总消耗时间 - **FGC**:目前 Full GC 次数总次数 - **FGCT**:目前 Full GC 次数总耗时(秒) - **GCT**:垃圾回收总耗时 使用 `jstat -gcutil <pid>` 可以统计 GC 信息,以百分比形式显示结果,例如: ```java jstat -gcutil 1 1000 100 ``` 示例结果:  #### jstack `jstack` 可以生成当前 JVM 的线程快照,显示每个线程的状态及正在执行的方法、锁相关的信息。使用 `jstack -l <进程id>` 可以打印堆栈信息及锁的附加信息,还可以检测死锁信息。 示例代码: ```java public static void main(String[] args) { final Integer lock1 = new Integer(1); final String lock2 = new String(); ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute(new Runnable() { @Override public void run() { synchronized (lock1) { System.out.println("线程1获得了lock1"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程1休眠结束"); System.out.println("线程1开始尝试获取lock2"); synchronized (lock2) { System.out.println("线程1获得了lock2"); } } } }); executorService.execute(new Runnable() { @Override public void run() { synchronized (lock2) { System.out.println("线程2获得了lock2"); System.out.println("线程2开始尝试获取lock1"); synchronized (lock1) { System.out.println("线程2获得了lock2"); } } } }); } ``` 使用 `jstack -l <进程id>` 可以打印当前的线程信息。 #### jmap - **`jmap -heap`**:生成当前堆栈快照,打印堆各分区内存使用情况。 - **`jmap -histo`**:打印当前堆中的对象统计信息,包括类名、实例数量和总占用内存大小。 示例结果:   - **`jmap -dump`**:生成当前的堆栈快照,用于分析内存溢出和内存泄露问题。例如,使用 `jmap -dump:format=b,file=dump.hprof <进程id>` 可以生成堆转储文件,然后使用 `jvisualvm` 工具打开进行分析。 示例代码: ```java public class Test018 { ArrayList<TestObject> arrayList = new ArrayList<TestObject>(); public static void main(String[] args) { Test018 test018 = new Test018(); for (int i = 0; i < 10000000; i++) { TestObject testObject = new TestObject(); test018.arrayList.add(testObject); } } private static class TestObject { public byte[] placeholder = new byte[64 * 1024]; // 每个变量是64k } } ``` 使用以下 JVM 参数可以在 OOM 时生成堆转储文件: ```java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heapdump.hprof ``` 示例结果:   #### MAT MAT(Memory Analyzer Tool)主要用于分析内存泄露问题。通过导入 `hprof` 文件,可以查看对象列表及潜在的内存泄露对象。例如,使用以下代码生成 `hprof` 文件: ```java public class Test018 { static ArrayList<TestObject> arrayList = new ArrayList<TestObject>(); public static void main(String[] args) { for (int i = 0; i < 10000000; i++) { TestObject testObject = new TestObject(); Test018.arrayList.add(testObject); } } private static class TestObject { public byte[] placeholder = new byte[64 * 1024]; } } ``` 示例结果:   通过对比两个堆转储文件,可以判断内存泄露问题。  编辑于 2023-06-17 23:25 •IP属地 北京举报评论收藏
改变的秘密,是把所有的精力全放在新的事物上,而不是与过去抗衡。穷凶极恶### 常见调优工具 调优工具可以分为两类:JDK自带监控工具和第三方工具。以下是常用的调优工具的简要介绍: #### JDK自带监控工具 1. **jconsole (Java Monitoring and Management Console)** - **作用**:从Java 5开始在JDK中自带的Java监控和管理控制台。用于对JVM中的内存、线程和类等进行监控。 - **特点**:提供实时数据,可用于监控内存使用情况、线程活动、类装载等。 - **启动方法**:在命令行中输入 `jconsole`。 2. **jvisualvm** - **作用**:JDK自带的全能工具,可以分析内存快照、线程快照,监控内存变化、GC变化等。 - **特点**:集成了多个监控和分析功能,提供图形化界面,易于使用。 - **启动方法**:在命令行中输入 `jvisualvm`。 #### 第三方工具 1. **MAT (Memory Analyzer Tool)** - **作用**:基于Eclipse的内存分析工具,是一个快速、功能丰富的Java堆分析工具。 - **特点**:可以帮助查找内存泄漏和减少内存消耗,分析大规模的heap dump文件。 - **使用方法**:从Eclipse官方网站下载并安装MAT。 2. **GChisto** - **作用**:专业的GC日志分析工具。 - **特点**:可以对GC日志进行详细的分析,帮助理解GC行为和性能瓶颈。 - **使用方法**:从GChisto官方网站下载并安装。 这些工具可以帮助开发人员和运维人员更好地监控和分析Java应用的性能,从而进行有效的调优。发布于 2022-03-27 23:47 •IP属地 辽宁举报评论收藏
公众号进入网站体验更佳

