JVM 分析工具概述

Posted 芋道源码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM 分析工具概述相关的知识,希望对你有一定的参考价值。

技术文章第一时间送达!

源码精品专栏

 
  •  69 篇

  •  61 篇



来源:http://t.cn/E2kmksD

  • JPS

  • Jstat

  • Jinfo

  • Jmap

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

  • Jstack

  • Jconsole

  • visualVm


JPS

java process status 查看进程

jps

C:Users84407>jps
13680 Jps
14704 JConsole
10148 Launcher
8788
10844 ThreadConsole

jps -q

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

C:Users84407>jps -q
18324
15336
19144
19816

jps -m

输出主函数传入的参数

C:Users84407>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:Users84407>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 FilesJetBrainsIntelliJ IDEA 2018.1libidea_rt.jar=61866:C:Program FilesJetBrainsIntelliJ IDEA 2018.1in -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 FilesJetBrainsIntelliJ IDEA 2018.1inidea64.exe.vmoptions -Didea.jre.check=true -Dide.native.launcher=true -Didea.paths.selector=IntelliJIdea2018.1 -XX:ErrorFile=C:Users84407java_error_in_idea_%p.log -XX:HeapDumpPath=C:Users84407java_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 FilesJetBrainsIntelliJ IDEA 2018.1 -Didea.config.path=C:Users84407.IntelliJIdea2018.1config -Didea.plugins.path=C:Users84407.IntelliJIdea2018.1configplugins -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 FilesJavajdk-10lib;C:Program FilesJavajre-10lib; -Dapplication.home=C:Program FilesJavajdk-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:Users84407>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

jmap -histo[:live]

打印堆的直方图

jmap -clstats

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

内存监控

img

线程监控

用下面这段代码来测试:

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();
    }
}
JVM 分析工具概述
第一次输入前
JVM 分析工具概述
第一次输入后&第二次输入前
JVM 分析工具概述
第二次输入后

检查死锁

/**
 * 模拟死锁并用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();
    }
}
JVM 分析工具概述
线程1
JVM 分析工具概述
线程0
JVM 分析工具概述
死锁检查
死锁查看

visualVm




已在知识星球更新源码解析如下:

  • 《精尽 Dubbo 源码解析系列》69 篇。

  • 《精尽 Netty 源码解析系列》61 篇。

  • 《精尽 Spring 源码解析系列》35 篇。

  • 《精尽 MyBatis 源码解析系列》34 篇。

  • 《数据库实体设计》17 篇。

  • 正在准备更新《精尽 Spring MVC 源码解析系列》


目前在知识星球更新了《Dubbo 源码解析》目录如下:

01. 调试环境搭建
02. 项目结构一览
03. 配置 Configuration
04. 核心流程一览

05. 拓展机制 SPI

06. 线程池

07. 服务暴露 Export

08. 服务引用 Refer

09. 注册中心 Registry

10. 动态编译 Compile

11. 动态代理 Proxy

12. 服务调用 Invoke

13. 调用特性 

14. 过滤器 Filter

15. NIO 服务器

16. P2P 服务器

17. HTTP 服务器

18. 序列化 Serialization

19. 集群容错 Cluster

20. 优雅停机

21. 日志适配

22. 状态检查

23. 监控中心 Monitor

24. 管理中心 Admin

25. 运维命令 QOS

26. 链路追踪 Tracing

... 一共 69+ 篇

目前在知识星球更新了《Netty 源码解析》目录如下:

01. 调试环境搭建
02. NIO 基础
03. Netty 简介
04. 启动 Bootstrap

05. 事件轮询 EventLoop

06. 通道管道 ChannelPipeline

07. 通道 Channel

08. 字节缓冲区 ByteBuf

09. 通道处理器 ChannelHandler

10. 编解码 Codec

11. 工具类 Util

... 一共 61+ 篇


目前在知识星球更新了《数据库实体设计》目录如下:


01. 商品模块
02. 交易模块
03. 营销模块
04. 公用模块

... 一共 17+ 篇


目前在知识星球更新了《Spring 源码解析》目录如下:


01. 调试环境搭建
02. IoC Resource 定位
03. IoC BeanDefinition 载入

04. IoC BeanDefinition 注册

05. IoC Bean 获取

06. IoC Bean 生命周期

... 一共 35+ 篇


目前在知识星球更新了《MyBatis 源码解析》目录如下:


01. 调试环境搭建
02. 项目结构一览
03. MyBatis 面试题合集

04. MyBatis 学习资料合集

05. MyBatis 初始化

06. SQL 初始化

07. SQL 执行

08. 插件体系

09. Spring 集成

... 一共 34+ 篇


源码不易↓↓↓↓

点赞支持老艿艿↓↓

以上是关于JVM 分析工具概述的主要内容,如果未能解决你的问题,请参考以下文章

分析定位占用CPU资源高的JVM线程

Java - JVM - jmc 开启 jfr

如何为自定义JVM语言实现静态代码分析工具的类型信息?

Android Gradle 学习笔记概述

Android Gradle 学习笔记概述

sjk 一个强大的jvm 分析工具