JVM分析工具概述

深入理解JVM分析工具
本文介绍了JVM的多种分析工具,包括JPS、Jstat、Jinfo、Jmap、Jhat和Jstack,详细讲解了它们的功能和使用方法。例如,JPS用于查看Java进程状态,Jstat提供类装载、内存和垃圾收集信息,Jinfo可以实时查看和调整虚拟机参数,Jmap用于分析堆内对象和内存使用,Jhat进行堆分析,而Jstack则用于打印线程堆栈信息。这些工具对于理解和优化Java应用的性能至关重要。

JPS

java process status 查看进程

jps

C:\Users\84407>jps
13680 Jps
14704 JConsole
10148 Launcher
8788
10844 ThreadConsole

jps -q

仅仅显示VM 标示,不显示jar,class, main参数等信息

C:\Users\84407>jps -q
18324
15336
19144
19816

jps -m

输出主函数传入的参数

C:\Users\84407>jps -m
15336 ThreadConsole
19144
19816 Launcher C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/annotations.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/httpclient-4.5.2.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/slf4j-api-1.7.10.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/log4j.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/snappy-in-java-0.5.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/util.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/jna.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/idea_rt.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/jps-model.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/jna-platform.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/oro-2.0.8.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/aether-dependency-resolver.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/httpcore-4.4.5.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/lib/netty-all-4.1.13.Final.jar;C:/Program Files/
19148 Jps -m

IntelliJ IDEA的pid:19816,参数就是后面那一大堆

jps -l

输出应用程序主类完整package名称或jar完整名称

C:\Users\84407>jps -l
15336 com.jvm.jconsole.ThreadConsole
19144
19816 org.jetbrains.jps.cmdline.Launcher
9704 jdk.jcmd/sun.tools.jps.Jps

jps -v

列出jvm参数

15336 ThreadConsole -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar=61866:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\bin -Dfile.encoding=UTF-8
19144  -Xms128m -Xmx750m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Dide.no.platform.update=true -Djb.vmOptionsFile=C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\bin\idea64.exe.vmoptions -Didea.jre.check=true -Dide.native.launcher=true -Didea.paths.selector=IntelliJIdea2018.1 -XX:ErrorFile=C:\Users\84407\java_error_in_idea_%p.log -XX:HeapDumpPath=C:\Users\84407\java_error_in_idea.hprof
19816 Launcher -Xmx700m -Djava.awt.headless=true -Djava.endorsed.dirs="" -Djdt.compiler.useSingleThread=true -Dpreload.project.path=D:/workspace/java-nio-and-netty-spring-demo -Dpreload.config.path=C:/Users/84407/.IntelliJIdea2018.1/config/options -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Djava.net.preferIPv4Stack=true -Dio.netty.initialSeedUniquifier=-6623792082140627021 -Dfile.encoding=GBK -Duser.language=zh -Duser.country=CN -Didea.paths.selector=IntelliJIdea2018.1 -Didea.home.path=C:\Program Files\JetBrains\IntelliJ IDEA 2018.1 -Didea.config.path=C:\Users\84407\.IntelliJIdea2018.1\config -Didea.plugins.path=C:\Users\84407\.IntelliJIdea2018.1\config\plugins -Djps.log.dir=C:/Users/84407/.IntelliJIdea2018.1/system/log/build-log -Djps.fallback.jdk.home=C:/Program Files/JetBrains/IntelliJ IDEA 2018.1/jre64 -Djps.fallback.jdk.version=1.8.0_152-release -Dio.netty.noUnsafe=true -Djava.io.tmpdir=C:/Users/84407/.IntelliJIdea2018.1/system/compile-server/java-nio-and-netty-spring-demo_64d579b4/_temp_ -Djps.backw
15052 Jps -Denv.class.path=.;C:\Program Files\Java\jdk-10\lib;C:\Program Files\Java\jre-10\lib; -Dapplication.home=C:\Program Files\Java\jdk-10 -Xms8m -Djdk.module.main=jdk.jcmd

详情请参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html

Jstat

类装载、内存、垃圾收集、jit编译信息

M:表示元空间,不再虚拟机中,而是使用本地内存。

Jinfo

实时查看和调整虚拟机的各项参数

jinfo -flags

查看jvm的参数

C:\Users\84407>jinfo -flags 15336
VM Flags:
-XX:CICompilerCount=3 -XX:InitialHeapSize=201326592 -XX:MaxHeapSize=3196059648 -XX:MaxNewSize=1065353216 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=67108864 -XX:OldSize=134217728 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC

jinfo -sysprops

查看java系统参数

...
user.name=84407
java.vm.specification.version=1.8
sun.java.command=com.jvm.jconsole.ThreadConsole
java.home=C\:\\Program Files\\Java\\jdk1.8.0_144\\jre
sun.arch.data.model=64
user.language=zh
java.specification.vendor=Oracle Corporation
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_144
java.ext.dirs=C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\ext;C\:\\WINDOWS\\Sun\\Java\\lib\\ext
sun.boot.class.path=C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\resources.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\rt.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\sunrsasign.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\jsse.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\jce.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\charsets.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\jfr.jar;C\:\\Program Files\\Java\\jdk1.8.0_144\\jre\\classes
java.vendor=Oracle Corporation
file.separator=\\
java.vendor.url.bug=http\://bugreport.sun.com/bugreport/
sun.io.unicode.encoding=UnicodeLittle
sun.cpu.endian=little
sun.desktop=windows
sun.cpu.isalist=amd64
...

jinfo -flag -PrintGC

表示禁用GC日志的打印,注意是减号

jinfo -flag +PrintGC

表示启用GC日志的打印,注意是加号

jinfo -flag PrintGC

查看是否开启了GC日志的打印,注意没有加减号

详情请参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html#BCGEBFDD


Jmap

打印JVM堆内对象情况,查询Java堆和永久代的详细信息,使用率,使用大小

jmap -finalizerinfo

打印正等候回收的对象的信息。

jmap -heap

打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况

jmap -clstats

打印classload的信息。包含每个classloader的名字、活泼性、地址、父classloader和加载的class数量

jmap -histo[:live]

打印堆的直方图

jmap -clstats

打印classload的信息。包含每个classloader的名字、活泼性、地址、父classloader和加载的class数量

jmap -dump:format=b,file=d:\a.bin pid

生成堆信息,并存到d:\a.bin这个文件

jmap -histo pid | more

查看类和实例数量和详情:

Jhat (一般不用,内存占用较高)

jvm heap analysis tool jvm堆分析工具

jhat d:\a.bin

分析堆信息文件,然后默认开7000端口,以网页的形式显示

oql

object query language,对象查询语言

Jstack

打印线程堆栈信息

jstack

查看某个Java进程内的线程堆栈信息

jstack -l

在发生死锁时可以用jstack -l pid来观察锁持有情况

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x00000000033b9000 nid=0x268c in Object.wait() [0x000000001b7be000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x0000000780808ec8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
        - locked <0x0000000780808ec8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

   Locked ownable synchronizers:
        - None

jstack -m

不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)

Jconsole

内存监控

 

线程监控

用下面这段代码来测试:

public class ThreadConsole {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        scanner.next();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    //空转
                }
            }
        },"while thread").start();
        scanner.next();
        new Thread(new Runnable() {
            @Override
            public void run() {
                Object object = new Object();
                synchronized (object){
                    try {
                        object.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

 

 

 

检查死锁

/**
 * 模拟死锁并用jconsole进行检测
 *
 * Created by Fant.J.
 */
public class DeadLock {
    public static void main(String[] args) {
        Object o1 = new Object();
        Object o2 = new Object();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (o1){
                    try {
                        System.out.println("获取到o1的锁");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (o2){
                        System.out.println("获取到o2的锁");
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (o2){
                    try {
                        System.out.println("获取到o2的锁");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (o1){
                        System.out.println("获取到o1的锁");
                    }
                }
            }
        }).start();
    }
}

 

 

 


作者:PlayInJava
链接:https://juejin.cn/post/6844903647067783176
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

### IntelliJ IDEA 内置的 JVM 分析工具 #### 工具概述 IntelliJ IDEA 集成了多个用于监控和优化 Java 应用程序性能的强大工具。这些内置工具可以帮助开发者识别应用程序中的瓶颈,从而改进应用的整体性能[^3]。 #### 性能分析器 (Profiler) IntelliJ IDEA 自带了一个基于 JMH(Java Microbenchmark Harness)框架的简单性能分析器。此工具允许用户测量特定代码片段的执行时间,并提供详细的统计报告来帮助理解哪些部分消耗了最多的时间资源[^4]。 对于更深入的应用程序性能剖析,JetBrains 推荐使用第三方专业级产品如 YourKit 或者 VisualVM 这样的开源解决方案;不过,在某些版本中,IntelliJ IDEA Ultimate Edition 可以直接集成本地支持的外部 profilers 如 Async Profiler 和 Java Flight Recorder(JFR)[^2]。 #### 调试器(Debugger) 虽然严格来说不是专门针对 JVM分析工具,但是调试器提供了非常有用的实时数据视图,包括变量状态、线程堆栈跟踪以及内存分配情况等重要信息。这有助于快速定位潜在问题所在的位置并加以修复[^1]。 #### 日志查看(Log Viewer) 日志文件是排查生产环境中遇到的问题不可或缺的一部分。通过集成的日志查看功能,可以直接在 IDE 内部浏览来自不同来源的日志条目,并且能够方便地过滤感兴趣的内容以便进一步调查可能存在的异常状况。 #### GC 观察(Garbage Collection Watcher) 垃圾回收机制对 JVM 来说至关重要,因为它负责自动管理和释放不再使用的对象所占用的空间。IntelliJ IDEA 支持监视正在运行的应用程序上的GC事件,使开发人员可以轻松观察到每次发生GC时的具体细节,比如暂停时间和频率等指标变化趋势图表展示形式呈现给使用者参考调整参数设置达到最优效果。 ```java // 启动带有GC日志记录选项的应用程序实例 public class Main { public static void main(String[] args) throws Exception{ System.setProperty("java.util.logging.config.file", "logging.properties"); // 添加必要的 VM 参数以启用 GC 日志输出 String vmOptions = "-XX:+PrintGCDetails -Xloggc:/path/to/gc.log"; ProcessBuilder pb = new ProcessBuilder("java", vmOptions, "-jar", "/path/to/your-app.jar"); pb.inheritIO(); Process process = pb.start(); Thread.sleep(60 * 1000); // 让进程保持一段时间 process.destroy(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值