程序员:为什么程序总是那么慢?时间都花到哪里去了?
\
面试官:若你写的 Java 程序,出现了性能问题,该怎么去排查呢?
\
工欲善其事必先利其器,为你呈上一箩筐性能优化工具,必有一款满足你,废话不多说,直奔主题。
\
*1. *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 文件进行分析堆快照,效果如下。
\
\
2. JConsole 工具
\
JConsole 是 Java 自带的图形化性能监控工具,可以让你摆脱命令行排查问题的痛苦。通过它,会非常容易的监测 Java 程序的运行情况。
\
\
2.1. 连接要监控的 Java 程序
\
首先进入 JDK 安装之后的 bin 目录,若是配置过 Java 的环境变量,直接运行 JConsole 就行,效果如下。
\
\
若是要监控本地 Java 进程,直接选择列表中的名称进行连接即可。
\
若是要监控远程 Java 进程,需要在远程 Java 程序启动时,需要加上下面几句话。
若是在 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 的功能。
\
*2.4. *****线程监控
**
**
如图所示,通过 JConsole 提供的线程页面,可以方便查看系统内的线程数量,以及程序中所有的线程,并且还能看到线程的栈信息。另外,该页面还提供了检测死锁的支持,那么就可以快速的帮我们定位死锁的问题啦。
\
*2.5. *****类加载情况
**
**
\
如图所示,JConsole 还能够显示类加载情况,包括已经装载的类数量,以及已经卸载的类数量。
\
*2.6. *****VM 摘要
**
**
\
如图所示,JConsole 提供的 VM 概要页面,能够显示当前 Java 应用程序的基本信息,包括运行环境、系统线程信息、堆信息等等。
\
*2.7. *****MBean 管理
**
**
\
通过 JConsole 提供的 MBean 页面,我们可以对应用中的 MBean 进行统一管理,鉴于之前在剖析 Resin 服务器源码的时候,我们多次用到过,本次不再铺开去说。
\
*3. *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 抽样器
**
**
Visual VM 提供 CPU 和内存两个抽样器。通过 CPU 抽样器,可以帮助我们快速找到程序中占用 CPU 时间最长的方法;通过内存抽样器,可以帮助我们查看当前程序的堆信息。
\
CPU抽样器效果图:
\
内存抽样器效果图:\
\
3.6 Profiler
**
**
Profiler 的功能和抽样器其实差不多,只不过抽样器是抽样进行检测,而 Profiler 是全面进行检测。
\
\
点击 CPU 按钮,效果如上图所示,则开启一个 CPU 性能分析会话,等 VisualVM 收集和统计完相关性能数据信息,将会显示在性能分析结果。
**
**
\
若点击内存按钮,则开启一个内存分析会话,等 VisualVM 收集和统计完相关性能数据信息,将会显示在性能分析结果,效果如上图所示。
\
3.7 快照
**
**
\
VisualVM 很多地方,都提供了快照功能,可以让我们保存某一个时刻应用程序的堆信息、线程堆栈等等保存成快照,以便性能优化后进行对比、分析使用。
\
3.8 插件
**
**
VisualVM 还可以通过安装插件,来实现更多可能性。
亲爱的小伙伴们,有需要java面试文档资料的请点赞收藏和转发哦,关注我之后点进我的主页右上角私信(555)即刻领取免费资料哦或点击:[shimo.im/docs/aBAYVx…]
4. 写****最后
程序员编码那是本能,但是若能更好的解决生产问题,则会彰显个人才能。\
\
工具一箩筐,你也别嫌多,因为总有一款适合你。但是工具说再多,若不进行实践,一切皆枉然,纸上得来终觉浅,只有实践才是硬道理!
\
有关 Java 性能分析工具,本次就分享就到这里,希望大家能够喜欢,下次我们将结合案例进行实践,敬请期待。
如果本文对你有帮助,别忘了关注,点赞,评论,转发,收藏哟!收藏等于白嫖,点赞才是真爱0.0