JVM学习日记(十六)Day16——性能监控与调优(三)

这一篇主包会介绍JVM性能监控的图形化界面,使用图形化界面会比使用命令行更加的直观一些,最主要的其实是不需要去记命令了,以及可以看到更加详细的信息。但是主包认为还是要以命令行为主,因为不是所有的场景都可以使用图形化界面的,所以具备JVM优化能力肯定是指在任何情况下都可以完成业务需求的水平,过度依赖其实只会让大火的技术水平止步不前。有时间主包也会出一期解析命令行源码的文章,让大家知道所谓的命令到底是怎么实现的、又是怎么做到的,这个才是一个技术应该做的事情,过度依赖中间件虽然让工作更加简单易上手,但是对自身没有任何的提升。

JDK内置工具

JConsole

JDK 自带的监控工具,支持查看堆内存、线程、类加载、MBean 等。启动命令:jconsole(在 JDK 的 bin 目录下)。适合基础监控,但功能较简单。这个其实可以作为一个常规的性能监控工具,因为UI设计简单清晰,看起来所有数据都是一目了然的,并不复杂。确定就是功能单一了只能进行简单的监控,有兴趣的小伙伴快去试一试,JConsole:Java性能监控与管理工具详解-CSDN博客

VisualVM

JDK 官方提供的增强版工具(需单独下载,JDK 9+ 后独立分发)。支持内存/CPU 分析、线程快照、堆转储分析、JMX 监控等。插件扩展:可安装 ​Visual GC​ 插件实时观察 GC 分代情况。

Java Mission Control (JMC)​

Oracle 官方工具(需商业授权用于生产环境,但开发/测试环境免费)。功能有

JMX 控制台 ​:实时监控 JVM 指标。飞行记录器 (JFR)​ ​:低开销采集性能事件(GC、锁竞争等)。启动命令:jmc(需安装 JDK 的 jdk.jmc 模块)。

2. 第三方工具

Eclipse Memory Analyzer (MAT)​

  • 专用于分析堆转储文件(.hprof),定位内存泄漏。功能:对象支配树、泄漏报告、OQL 查询等。

JProfiler​(推荐)

商业工具,提供全面的 CPU、内存、线程分析。特点就是支持远程连接和快照对比。实时调用树、内存分配追踪、数据库 SQL 分析。
*

YourKit

另一款商业工具,性能分析精准,支持多种 JVM 语言(Java/Kotlin/Scala)。

  • GCViewer

    • 可视化分析 GC 日志工具,支持 -Xloggc-Xlog:gc* 生成的日志。
    • 官网:GCViewer GitHub。

JProfiler

本篇主要介绍JProfiler,主要是功能太强大了,比前面说到的都要强大,毕竟人家是收费的。

链接:https://pan.quark.cn/s/89b22a482b90

提取码:gHDz

主包这边只有mac版本的,所以window的小伙伴还是去其他地方找找资源吧。这个是整合的教程,主包就不给大家出安装教程了,大火自己看看吧。Java JVM分析利器JProfiler 结合IDEA使用详细教程_jprofiler使用教程-CSDN博客

JProfiler 的数据采集方式概览

Instrumentation(插桩)​

JProfiler 在 JVM 加载类时,动态修改字节码,在方法的入口和出口插入监控代码(类似 AOP),记录每次方法调用的耗时、参数、返回值等。特点 ​就是记录所有方法调用 ,无遗漏。能获取 ​方法参数、返回值 ​(适合调试复杂逻辑)。支持 ​行级分析 ​(Line-level Profiling),精确到代码行。缺点​就是:性能开销大(可能使应用变慢 10%-20%)。不适合高并发或生产环境。

配置方式 ​:在 JProfiler 中选择 ​Instrumentation​ 模式,并过滤需要插桩的包(减少开销)。

​全采样(Sampling)​

JVM 每隔固定时间(如 10ms)中断所有线程,记录当前线程的堆栈信息,通过统计方法在采样中出现的频率推断其耗时。特点 ​是低开销 ​(通常 <1% CPU 占用)。适合长期监控生产环境。缺点 ​是可能遗漏短暂方法 ​(如执行时间 < 采样间隔的方法)。无法获取方法参数、返回值。配置方式 ​就是选择 ​Sampling​ 模式,调整采样间隔(默认 10ms)就是上面的图点编辑进去有个采样。

异步采样(Async Sampling)​

就是 混合模式,对关键方法(如自定义业务方法)使用插桩,对 JVM/第三方库方法使用采样。平衡精度和性能,​比纯采样更精准,比纯插桩开销更低缺点 ​就是配置复杂,需明确哪些方法需要插桩。

这个就是正在监测的页面,可以看到数据是动态的,这个可以根据不同的二级目录查看需要的视图,类似于数据大屏的效果,想看详细的信息就要看其他的一级菜单了。

这个是内存的信息,自动更新的时间是两秒,点击也可以马上更新,然后点击标记当前可以看到各个类的增加和减少的信息,这个用处就是蛮大了,比如可以根据类的增加来判断是否内存泄漏了。然后再结合二级菜单中的记录的对象可以更加直观的看到内存泄漏。

还是一样我们点击标记当前,然后选择活动对象或者垃圾回收对象,这个1/10分配的意思就是创建或者回收10个类才会被记录一次,也可以选择全记录但是性能开销就太大了,然后我们可以先观察活动对象的情况,一段时间后点击运行GC或者直接选择垃圾回收对象,查看哪些对象被回收了,再对比活动对象,如果一个类创建率高但是回收率低那么可能就是内存泄漏了。

然后剩下的三个分别是分配调用树、分配热点、类追踪器,分配调用树 :是 JProfiler 中用于分析 ​对象分配路径 ​ 的核心功能,它通过追踪对象的创建位置(即哪些方法调用了 new 关键字或工厂方法创建了对象),帮助开发者定位​内存分配热点 ​ 和潜在的内存问题(如内存泄漏、过度分配等)。分配热点: 核心功能​就是​直接列出最耗内存的分配点​:平铺展示分配次数最多或内存占用最高的方法(无需查看完整调用链)。快速定位到具体的方法或类。解决的问题​是高频小对象分配​:如循环内重复创建 StringInteger 等。大对象集中分配​:如批量加载数据时一次性分配大数组。类追踪器:这个就不要多说了吧,就是追踪我们指定的类或者包的对象创建数量。

好了这三个小功能放在下篇详细说明,今天主包有点忙来不及了。

总结

本篇介绍了市面上常见的GUI图形化JVM监控工具,推荐的是JProfiler,简单的说明了一下JProfiler的几个常用功能,附上mac的JProfiler14安装包和破解码。