优化Java程序的实用工具!
工欲善其事必先利其器,为你呈上一箩筐性能优化工具,必有一款满足你,废话不多说,直奔主题。
- hprof 工具
hprof 工具是通过织入监控代码,来对 Java 程序进行监控的一款工具。可以监控 Java 程序在运行时占用的 CPU,及统计堆内存使用等。
例如:每隔 10 毫秒采样 CPU 消耗信息,并把信息保存到 hprof.txt 文件中。
java -agentlib:hprof=cpu=times,interval=10,file=hprof.txt class
指令运行完,打开 hprof.txt 便很容易统计出哪些方法的运行耗时较长。
例如:输出 Java 应用程序中各个类所占用的内存百分比。
java -agentlib:hprof=heap=sites,file=hprof.txt class
备注:若未指定 file=hprof.txt,则默认会生成 java.hprof.txt 文件
打开输出的文件,效果如下。
例如:将 Java 应用程序的堆快照保存在文件 core.hprof 中,然后就可以使用 VisualVM 等工具来分析这个堆文件啦。
java -agentlib:hprof=heap=dump,format=b,file=core.hprof class
采用 VisualVM 工具打开 core.hprof 文件进行分析堆快照,效果如下。
- JConsole 工具
JConsole 是 Java 自带的图形化性能监控工具,可以让你摆脱命令行排查问题的痛苦。通过它,会非常容易的监测 Java 程序的运行情况。
2.1. 连接要监控的 Java 程序
首先进入 JDK 安装之后的 bin 目录,若是配置过 Java 的环境变量,直接运行 JConsole 就行,效果如下。
若是要监控本地 Java 进程,直接选择列表中的名称进行连接即可。
若是要监控远程 Java 进程,需要在远程 Java 程序启动时,需要加上下面几句话。
# 远程服务器的ip地址
-Djava.rmi.server.hostname=127.0.0.1
# 指定jmx监听的端口
-Dcom.sun.management.jmxremote.port=8099
# 指定jmx监听的端口
-Dcom.sun.management.jmxremote.rmi.port=8099
# 是否开启ssl
-Dcom.sun.management.jmxremote.ssl=false
# 是否开启认证
-Dcom.sun.management.jmxremote.authenticate=false
若是在 IDEA 开发工具中进行验证,按照下图进行配置,跑程序就行。
若是命令行启动时,按照下述方式配置,启动就行。
java -cp . -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=8099 -Dcom.sun.management.jmxremote.rmi.port=8099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false className
启动远程 Java 程序,JConsole 输入远程服务 IP 和 端口,连接即可。
2.2. 监控 Java 程序概况
如图所示,JConosle 连接上要监控的 Java 程序后,可以很方便的查看堆内存使用量、线程数量、加载类的数量以及 CPU 的占用率。
2.3. 内存监控
如图所示,在 JConsole 提供的内存监控页面,不仅能看到堆内存的使用情况,而且能查看非堆区的内存使用情况等等。另外,还提供了让 Java 应用强制进行一次 GC 的功能。
- VisualVM 工具
Visual VM 是可以替代 jstat、jmap、jhat、jstack 命令的一款故障诊断和性能监控的可视化工具,甚至可以替代 JConsole,所以我们还是有必要进行了解一下。
3.1 连接要监控的 Java 程序
首先进入 JDK 安装的 bin 目录,运行 jvisualvm,启动起来后和 JConsole 一样,可以选择本地和远程进行连接,效果如下。
本次着重介绍一下这款工具能干啥,如何连接 Java 程序就不带着一起做实验啦,不过已把操作步骤帮你梳理好了,照着做就行啦
3.2 概述
如图所示,通过 VisualVM 提供的概述功能页,可以很方便的查看 Java 程序的进程 ID、JVM 参数、系统属性等等信息。
3.3 监视
这块和 JConsole 很像,VisualVM 将 CPU 使用情况、堆使用情况、类加载信息以及线程都做了图形界面展示,可以很直观的进行监测。
3.4 线程监控
VisualVM 可以展示详细的线程信息,让线程信息一览无余,并且会自动进行死锁检测,如果在当前程序中找到死锁,则会提示“检测到死锁”。另外,通过线程 Dump可以导出当前所有线程的堆栈信息。
3.5 抽样器
内存抽样器效果图:
- 写最后
程序员编码那是本能,但是若能更好的解决生产问题,则会彰显个人才能。
工具一箩筐,你也别嫌多,因为总有一款适合你。但是工具说再多,若不进行实践,一切皆枉然,纸上得来终觉浅,只有实践才是硬道理!