共计 3434 个字符,预计需要花费 9 分钟才能阅读完成。
Java 性能分析神器 1 –VisualVM Launcher
VisualVM
当你日复一日敲代码的时候,当你把各种各样的框架集成到一起的时候,看着大功告成成功运行的日志,有没有那么一丝丝迷茫和惆怅:这 TM 起的是什么玩意?每一行日志背后代表的是什么东西??他为什么就能跑起来了呢????
这种时候不要慌,给大家推荐一款功能强大的插件:VisualVM Launcher。(eclipse 就叫 VisualVM)。这个插件需要和客户端配合使用 VisualVM。
VisualVM 是集成了命令行 JDK 工具和轻量级分析功能的可视化工具。JVM 提供了一些常用的 jdk 命令行工具:
- jstat(JVM Statistics Monitoring Tool): 用于收集 Hotspot 虚拟机各方面的运行数据(查看虚拟机各云心状态信息),显示本地或远程虚拟机进程中的类装载,内存,垃圾收集,JIT 编译等运行数据。
- jps(JVM Process Status Tool): 显示指定系统内所有的 HotSpot 虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程,同时可选择性的显示虚拟机执行主类,即执行 main 函数的类,以及进程的本地虚拟机
ID(Local Virtual Machine Identifier 简称 LVMID)(对于本地虚拟机进程来说,进程的本地虚拟机 ID 与操作系统的进程 ID 是一致的) - jinfo(Configuration Info for Java): 显示虚拟机配置信息(查看虚拟机配置参数信息),可用于查看和调整虚拟机的配置参数.
- jmap(JVM Memory Map): 生成虚拟机的内存转储快照,生成 heapdump 文件(生成虚拟机内存转储快照),可用于获取 heapdump 文件,且可以查询 finalize 执行队列,Java 堆与永久代的一些信息。
- jhat(JVM Heap Dump Browser): 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户在浏览器上查看分析结果(分析虚拟机转储快照信息),jhat 命令与 jmap 命令搭配使用,用于分析 jmap 生成的堆转储快照,jhat 内置了一个微型的 HTTP/HTML 服务器,生成 dump 文件的分析结果后,可以在浏览器中查看。
- jstack(JVM Stack Trace): 显示虚拟机的线程快照(虚拟机堆栈跟踪),用于生成虚拟机当前时刻的线程快照。线程快照指的是当前虚拟机内的每一条线程正在执行的方法堆栈的集合,生成线程快照的作用是,可用于定位线程出现长时间停顿的原因,如线程间死锁,死循环,请求外部资源导致的长时间等待等问题,当线程出现停顿时 就可以用 jstack 各个线程调用的堆栈情况
这些工具功能强大,可以很方便的查看 jvm 内存分配,内存大小,装载类总数,线程总数等。有了这些信息,就可以很快的进程诊断,性能调优辣。
安装 VisualVM 和 VisualVM Launcher
1. Idea 安装 VisualVM Launcher 插件
Preferences –> Plugins –> 搜索 VisualVM Launcher,安装重启即可
2. 配置 Idea VisualVM Launcher 插件
Preferences –> other settings -> VisualVM Launcher –> 输入 VisualVM executable 和 JDK home 即可
3. 配置完之后的 idea 页面
4. 安装 VisualVM 客户端
http://visualvm.github.io/download.html –> 选择对应的系统安装包 –> 对应安装,安装完成后打开是这样的页面:
VisualVM 和 java 命令行工具
1. jmap+jhat 内存快照与分析:Heap Dump
- HeapDump 又叫做堆存储文件,指一个 Java 进程在某个时间点的内存快照。Heap Dump 在触发内存快照的时候会保存此刻的 java 对象和类的信息。通常在写 heap Dump 文件前会触发一次 FullGC,所以 heap dump 文件里保存的都是 FullCG 后留下的对象信息。
- jmap 进行内存快照方式:
jmap -dump:format=b,file=<filename.hprof> <pid>
jhat 进行内存快照分析:
jhat <heap dump file>
- 使用了 jhat 命令,就启动了一个 http 服务,端口是 7000,即 http://localhost:7000/,就可以在浏览器里分析
VisualVM 进行内存快照方式:
- 在“应用程序”窗口中右键单击应用程序节点,然后选择“堆 Dump”。
- 在“应用程序”窗口中双击应用程序节点以打开应用程序标签,然后在“监视”标签中单击“堆 Dump”。
- VisualVM 快照页面,也可以右键保存此时的快照:
想要打开保存好的 java 快照:
- 单击“堆 Dump”工具栏中的“类”,以查看活动类和对应实例的列表。
- 双击某个类名打开“实例”视图,以查看实例列表。
- 从列表中选择某个实例,以查看对该实例的引用。
2. jinfo:显示虚拟机配置信息(查看虚拟机配置参数信息)
- 虚拟机配置信息:JVM 的启动参数
- jinfo 进行查看虚拟机配置信息查询(jinfo -help 查看更多)
jinfo <pid>
- Visual VM 查看虚拟机配置信息,直接在应用程序打开,就可以看到 JVM 参数 和 系统属性:
一些常见的虚拟机配置参数:
- -Xms:初始堆大小。如:-Xms256m
- -Xmx:最大堆大小。如:-Xmx512m
- -Xmn:新生代大小。通常为 Xmx 的 1/3 或 1/4。
- -Xss:为每个线程分配的内存大小,JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话,1M 是绝对够用了的。
- -XX:NewRatio:新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的 1 /3,老年代占 2 /3
- -XX:SurvivorRatio:新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10
-XX:PermSize:永久代 (方法区) 的初始大小
PermSize 永久代的概念在 jdk1.8 中已经不存在了,取而代之的是 metaspace 元空间,当认为执行永久代的初始大小以及最大值是 jvm 会给出如此下提示:
- Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=30m; support was removed in 8.0
- Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=30m; support was removed in 8.0
- -XX:MaxPermSize:永久代 (方法区) 的最大值
- -XX:+PrintGCDetails:打印 GC 信息
- -XX:+HeapDumpOnOutOfMemoryError:让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,以便分析用
3. jps 查看虚拟机进程信息
- 用来查询正在运行的虚拟机进程
jps 命令,详情查看:
jps
- VisualVM 查看正在运行的虚拟机进程:
4. jstack 显示虚拟机的线程快照
- 生成虚拟机当前时刻的线程快照,用来查找运行时死锁,死循环的原因
jstack 命令,详情查看
jstack <pid>
VisualVM 生成虚拟机线程快照方式:
- 在“应用程序”窗口中右键单击应用程序节点,然后选择“线程 Dump”。
- 在“应用程序”窗口中双击应用程序节点以打开应用程序标签,然后在“线程”标签中单击“线程 Dump”。
- VisualVM 线程快照页面,也可以右键保存快照:
5. jstat 收集 Hotspot 虚拟机各方面的运行数据
- 运行数据:对 Java 应用程序的资源和性能进行实时监控,主要包括 GC 情况和 Heap Size 资源使用情况。
jstat 进行资源与性能监控,详情查看:
jstat -gc <pid>
- VisualVM 进行程序资源的实时监控:
VisualVM 也提供了一些其他功能
- JMX 代理连接
- 远程环境监控
- CPU 分析和内存分析
此外,VisualVM 也提供很多插件,有各样的功能,我就不多介绍了
这篇文章,介绍了 VisualVM 的作用和用法,下面会写一篇姊妹篇 [<font color=”red”> 点这里 </font>]() 带上代码,去分析当系统出现死锁或者循环等异常时,内存、线程和 CPU 在做什么。
欢迎访问我的个人博客