写点什么

浅谈 Java Profiling

作者:乘云 DataBuff
  • 2024-06-27
    浙江
  • 本文字数:1981 字

    阅读完需:约 6 分钟

浅谈Java Profiling

在 Java 应用程序的开发与维护生命周期中,性能优化是确保系统高效运行的关键步骤之一。Java Profiling 作为一种强大的诊断技术,能够帮助开发者深入理解程序运行时的行为,识别并解决诸如内存泄漏、CPU 瓶颈、线程竞争等性能问题。本文旨在浅析 Java Profiling 的基本概念、重要性以及常用的 Java Profiling 工具,并简要介绍如何利用这些工具进行性能分析。


Java Profiling 基础

Java Profiling 主要涉及以下几个关键领域:

内存分析:追踪对象分配、垃圾回收活动,识别内存泄漏;

CPU 分析:确定哪些方法或代码段消耗了最多的 CPU 资源;

线程分析:监控线程活动,检测死锁和竞态条件;

I/O 分析:评估磁盘和网络 I/O 操作的效率。


为何进行 Java Profiling

1.提升性能:通过定位瓶颈,优化代码,减少响应时间和提高吞吐量。

2.预防问题:在生产环境部署前发现并修复潜在的性能问题。

3.故障诊断:辅助解决现场出现的性能下降或服务中断问题。

4.优化资源利用:合理分配内存、CPU 等资源,降低运行成本。



常用 Java Profiling 工具

1. VisualVM

简介:VisualVM 是 Oracle 提供的一款免费且功能全面的 Java profiling 工具,适用于 Java SE 平台。它集成了内存分析、CPU 分析、线程分析等功能。

特点:界面友好,易于上手,适合初学者和日常维护使用。


2. YourKit Java Profiler

简介:YourKit 是一款商业 Java Profiler,支持远程和离线分析,功能强大,广泛应用于复杂的性能调优场景。

特点:提供详尽的内存和 CPU 分析报告,支持代码级别的性能剖析,适合深度性能分析。


3. JProfiler

简介:JProfiler 同样是一款商业工具,以其直观的界面和丰富的功能著称。

特点:提供多种视图展示性能数据,支持 JDBC、JMS、NIO 等技术的专门分析。


4. Java Mission Control (JMC) + Flight Recorder

简介:从 Java 7 开始,Oracle 引入了 JMC 作为 Java 应用的管理和诊断工具,Flight Recorder 则是其核心组件之一,用于低开销地记录详细的运行时数据。

特点:低侵入性,可以在生产环境中使用,提供高级分析能力。

5. Async-Profiler

简介:async-profiler 是一个开源的高性能低开销的 Java 采样分析器,不受 safepoint 机制限制,数据更精确;兼容多个平台(mac,linux,windows)和大部分常用 JDK(1.6+)。

特点:能直接生成火焰图或者 jfr 文件,也可以直接输出采样文本便于二次加工;能够很方便地被各种 APM 或者可观测工具集成,可以在生产环境中使用。


6. Arthas

 a. 简介:arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,可方便地记录分析 cpu,内存分配,锁等事件(底层使用 async-profiler 实现)。

b. 特点:国内大厂开源,社区活跃,上手使用简单,功能强大。


7. Databuff

a. 简介:Databuff 是一款功能强大的商用产品,提供一站式的监测能力,包括基础设施、网络性能、应用性能、用户真实体验等功能。

b. 特点:低侵入性,开箱即用,支持代码级别的深度性能分析,可观测能力强。


如何进行 Java Profiling


1. 选择工具:根据项目需求选择合适的 Profiling 工具。

2. 配置环境:确保 Profiling 工具与 Java 应用兼容(系统 JDK 版本等),配置相关参数(如 JVM 参数)。

3. 启动分析:使用工具启动应用或连接到已运行的应用进程。

4. 数据收集:在应用执行典型任务时,收集性能数据。

5. 分析结果:审查报告,识别性能瓶颈和异常行为。

6. 优化与验证:根据分析结果优化代码,重复上述过程验证效果。


Java Profiling 工具对比


当 JVM CPU 使用率过高时如何排查

1. 使用 Arthas 排查

可以选择使用上述工具中的一个比如 arthas 进行 CPU Profiling 诊断,生成 cpu 火焰图,排列出使用 cpu 最高的代码结合业务排查。

假设当发现一个 demoB 应用有 cpu 使用率过高问题,先从 arthas 官网下载 arthas 工具包,然后运行 java -jar arthas-boot.jar 命令,找到对应的进程,attach 进入,然后执行 profiler start 命令,一段时间后执行 profiler stop --format html 命令生成 cpu 使用火焰图:

打开 html 文件

cpu 火焰图的查看方法可以网上搜索得到。通过上图看到 cpu 的热点代码都在 spring 框架中,业务代码上没有很明显的热点。

得出结论:当前 cpu 使用率过高应该是应用整体流量较高而不是某部分业务代码存在问题。


2. 使用 DATABUFF 可观测工具排查

在应用性能/详细分析/热点方法 标签页能够看到当前应用内每个业务代码入口的 cpu 使用时间占整体应用的百分比,假设 ServiceController.endpoints 请求执行耗费 cpu 比例飙高,那么可以按层级打开,类似火焰图形式查看最顶层的代码及其耗费 cpu 比例。


结语

Java Profiling 是保障应用程序健康运行不可或缺的一环,它不仅能够揭示隐藏的性能问题,还能够指导开发者作出更明智的设计决策。随着工具的不断进化,如今的 Java Profiling 变得更加易用且功能丰富,为开发者提供了强大的性能分析支持。掌握基本的 Profiling 技巧,将极大提升开发效率和软件质量。



发布于: 刚刚阅读数: 5
用户头像

让云运维更简单 2023-06-25 加入

云观测领导者

评论

发布
暂无评论
浅谈Java Profiling_Java Profiling_乘云 DataBuff_InfoQ写作社区