Java 程序该怎么优化?工具篇

201 阅读6分钟

程序员:为什么程序总是那么慢?时间都花到哪里去了?

\

面试官:若你写的 Java 程序,出现了性能问题,该怎么去排查呢?

\

工欲善其事必先利其器,为你呈上一箩筐性能优化工具,必有一款满足你,废话不多说,直奔主题。

\

*1. *hprof 工具

\

hprof 工具是通过织入监控代码,来对 Java 程序进行监控的一款工具。可以监控 Java 程序在运行时占用的 CPU,及统计堆内存使用等。

pIYBAF1CnWGAJ7HgAATz1-r9X2Q934.png 例如:每隔 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 程序启动时,需要加上下面几句话。

image.png 若是在 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