Woody:开源Java应用性能诊断分析工具

核心价值

Woody是一款专注于Java应用性能问题诊断的工具,旨在帮助开发者

  1. 定位高GC频率问题,识别内存分配热点
  2. 分析CPU使用率过高的代码路径
  3. 追踪接口耗时瓶颈,定位内部操作耗时占比
  4. 诊断锁竞争问题,支持精准优化
  5. 针对特定业务接口/请求的性能问题(CPU、内存、耗时)进行深度分析

代码仓库

https://github.com/happy-profiler/woody
目前发布第一版,后续会不断丰富功能,不断完善,欢迎感兴趣同行使用,提建议,bug,issue和pr。

适用环境

  • JDK版本:支持JDK 1.8及以上
  • 操作系统
    • macOS
    • Linux x64/arm64
  • 低版本JDK和其他操作系统暂不支持

核心特性

  • 基于命令行交互,集成async-profiler生成采样样本和火焰图
  • 实现业务请求与火焰图样本的精确关联
  • 支持手动过滤无关业务入口,提高采样精准率
  • 极低性能损耗,适合生产环境使用
  • 代码少量借鉴自Arthas

支持中间件

  1. SpringMVC
  2. Dubbo
  3. Grpc
  4. Kafka
  5. RocketMQ

后续将持续扩展支持更多中间件

快速开始

  1. 从项目release页面下载最新版本的woody-boot-xxx.jar
  2. 启动工具:
    java -jar woody-boot-1.0.0.jar
    
  3. 选择目标Java进程编号,进入命令交互界面,输入stop结束退出

在这里插入图片描述

命令参考

单横杠-表示命令操作,双横杠--表示参数,后续要接参数值

pr(profiling resource)- 选择分析的业务入口

用于指定需要分析的业务入口资源,可同时选择多种中间件的多个入口。

参数说明
-ls列举当前应用的所有业务入口资源
-lt列举当前应用支持的业务资源类型
-s选择业务入口资源
-us移除已选中的业务入口资源
-lst列举已选择的业务入口资源类型列表(未选择时为空)
-lss列举已选择的业务入口资源
–type指定中间件类型(支持上述5种类型)
–order指定中间件业务入口的资源编号(多编号用英文逗号分隔)
不指定时表示选择该类型的所有入口资源

在这里插入图片描述

pe(profiling event)- 选择采集事件类型

用于指定需要采集的性能事件类型,对应async-profiler的4种火焰图类型。

参数说明
-l列举当前应用支持的事件类型
(注:部分应用可能不支持alloc,取决于JDK版本和操作系统)
-s选择要采集的事件类型
–cpuCPU事件,参数为采样间隔(ms)
–alloc内存分配事件,参数为采样阈值(kb)
–wall耗时事件,参数为采样间隔(ms)
–lock锁竞争事件,参数为采样间隔(ms)
-c清除已选中的事件类型

支持同时选择多个事件类型,将生成对应类型的火焰图

在这里插入图片描述

pf(profiling)- 操作性能分析过程

用于控制async-profiler的启动、停止和状态查询。

参数说明
start启动性能分析
(启动后需在30秒内触发已选择的业务入口请求,否则启动失败)
stop结束性能分析
status查询当前性能分析状态(未运行/已运行时长)
–duration设置分析持续时间(秒),时间到后自动结束
(非必须,可通过stop命令提前结束)
–file指定分析结束后生成的火焰图文件名
(默认生成在工具运行目录,多事件时会自动添加类型前缀)
(未指定时,采样结果将被缓存,供ts命令使用)

在这里插入图片描述

在这里插入图片描述

ts(trace sample)- 检索分析业务请求和样本,生成火焰图

用于检索性能分析样本,支持通过traceId定位特定请求,或查看资源消耗TopN的请求。

参数说明
-l列出采样样本(需配合–id或–top参数)
-f生成火焰图(需配合–id或–top参数)
-c清除缓存的前次分析样本数据
–file指定生成的火焰图文件名(配合-f参数使用)
–event指定分析事件类型
(当pe命令选择多个事件时必须指定,单个事件时可省略)
–id指定traceId(业务请求唯一标识),检索对应请求的样本
–top指定数量N,检索资源消耗最多的前N个请求ID
(将显示样本数量、起止时间等信息)

traceId默认生成规则:1~Long.MAX_VALUE间的随机数

可通过修改ParametricIdGenerator实现自定义traceId生成逻辑(从业务上下文/参数/入口对象提取),下个版本可通过命令及表达式从业务请求生成

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如何本地编译及调试

本地编译: clone工程,执行 mvn clean package -DskipTests ,boot模块生成的jar包就是工具包,直接运行即可

调试: 待分析应用添加远程debug参数和端口 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Xdebug ,woody工程直接远程关联debug即可

火焰图查看

火焰图的具体查看方法请参考相关文档或通过AI工具学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920842.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《山东棒球》板球比赛规则·棒球1号位

⚾ Baseball vs Cricket 终极科普|规则异同发展史全解!Hey sports babes!别再傻傻分不清棒球⚾和板球!全网最清晰双运动对照指南来啦~⚾ 棒球 Baseball|美式激情风暴Core Goal核心目标击球员(Ba…

【游戏开发】Houdini相较于Blender在游戏开发上有什么优劣势?我该怎么选择开发工具?

在游戏开发中,Houdini与Blender的选择需结合项目规模、技术需求和团队资源综合考量。以下是两者的核心优劣势对比及决策建议: 一、核心优劣势对比 Houdini的优势与局限 优势:程序化内容生成的统治力 Houdini的节点系统(如VEX语言、…

基于开源AI智能名片链动2+1模式S2B2C商城小程序的用户活跃度提升与价值挖掘策略研究

摘要:本文聚焦于在开源AI智能名片链动21模式S2B2C商城小程序环境下,探讨如何提高用户活跃度并挖掘用户价值。在用户留存的基础上,通过分析该特定模式与小程序的特点,提出一系列针对性的策略,旨在借助开源AI智能名片以及…

《投资-41》- 自然=》生物=》人类社会=》商业=》金融=》股市=》投资,其层层叠加构建中内在的相似的规律和规则

从自然到投资的层层递进中,尽管各领域看似差异巨大,但内在遵循着相似的规律和规则。这些规律体现了“底层逻辑的普适性”,即不同系统在动态平衡、资源分配、信息传递和反馈调节等方面具有共性。以下是关键规律的解析:1. 能量流动与…

VSCode中调试python脚本

VSCode中安装以下插件 ms-python.python:python调试ms-python.vscode-pylance:代码跳转(非必要) 配置launch.json 在当前工作区,按此路径.vscode\launch.json新建launch.json文件,并配置以下参数&#x…

动作指令活体检测通过动态交互验证真实活人,保障安全

在当今社会,人脸识别技术已深入日常生活的方方面面,从手机解锁、移动支付到远程开户、门禁考勤,人脸识别技术已无处不在。然而,这项技术也面临着严峻的安全挑战:打印照片、播放视频、制作3D面具等简单的“欺骗手段”都…

KingbaseES数据库:开发基础教程,从部署到安全的全方位实践

KingbaseES数据库:开发基础教程,从部署到安全的全方位实践 KingbaseES数据库:开发基础教程,从部署到安全的全方位实践,本文围绕 KingbaseES 数据库开发核心基础展开。先介绍三种部署模式,即单机、双机热备、…

安装nodejs安装node.js安装教程(Windows Linux)

文章目录Linux**一、下载 Node.js**1. **访问官网**:2. **选择版本**:**二、安装 Node.js****方法 1:使用包管理器(推荐)****Ubuntu/Debian 系统**1. **更新包列表**:2. **安装 Node.js**:3. **…

shell脚本函数介绍

1. 函数 (Functions)定义与优势函数是可重复使用的功能模块优势:代码复用,直接调用解决问题分类内置函数:编程语言自带的函数(如 print)自定义函数:程序员自己编写的函数定义语法# 方式一 function 函数名(…

DAY 20 奇异值SVD分解-2025.9.1

奇异值SVD分解 知识点回顾: 线性代数概念回顾奇异值推导奇异值的应用 a. 特征降维:对高维数据减小计算量、可视化 b. 数据重构:比如重构信号、重构图像(可以实现有损压缩,k 越小压缩率越高,但图像质量损失…

《C++——定长内存池》

一、为什么需要内存池? 常规的new/delete操作存在两个主要问题: 性能开销大:每次new都需要向操作系统申请内存,delete需要归还给系统,这涉及内核态与用户态的切换,在高频次调用时性能损耗明显。 内存碎片&a…

【跨境电商】上中下游解释,以宠物行业为例

上中下游概念及其在宠物行业的应用 在产业链分析中,“上中下游”指的是一个产品或服务的不同环节:上游涉及原材料供应和基础资源,中游负责生产加工和制造,下游则包括销售、分销和服务。这种划分有助于理解整个价值链的运作。下面&…

飞牛NAS上部署Markdown文稿编辑器,阅读.md文件同时还可以跨平台访问!

前言前段时间小白在使用.md文件的阅读器,好像是什么*ypor*,但是这个软件它收费。(也不是找不到PJ版本,只是感觉这是人家的知识产权,就不整了。)于是小白在寻找能够代替这个软件的其他软件,而且如…

浅谈 SQL 窗口函数:ROW_NUMBER() 与聚合函数的妙用

在日常开发中,我们经常会遇到这样的需求:既要保留明细数据,又要对数据进行排名、累计、分区统计。如果仅依赖传统的 GROUP BY,往往需要做多次子查询或者复杂的 JOIN,既繁琐又低效。 而 窗口函数(Window Fun…

DSPFilters实现低通滤波器(QT)

DSPFilters实现低通滤波器DSPFilters实现低通滤波器DSPFilters安装-构建静态库QT代码复制include和静态库到qt项目qt代码配置效果DSPFilters实现低通滤波器 https://github.com/vinniefalco/DSPFilters DSPFilters安装-构建静态库 用 Qt 自带的 MinGW(最简单&…

mybatis plus 基本使用和源码解析

简介 mybatis-plus是一款mybatis增强工具,用于简化开发,提高效率。mybatis-plus免去了用户编写sql的麻烦,只需要创建好实体类,并创建一个继承自BaseMapper的接口,mybatis就可以自动生成关于单表的crud。mybatis-plus自…

【Android】Notification 的基本使用

文章目录【Android】Notification的基本使用权限通知的基本使用1. 获取通知管理器(用于发送、更新、取消通知)2. 创建通知渠道(Android 8.0 必须)3. 使用通知3.1 发送通知3.2 更新通知3.3 取消通知通知的进阶技巧通知显示样式1. B…

Web前端开发基础

1.前端概论 1.1 什么是前端? 概念:前端(Front-End),也称为客户端(Client-Side),指的是用户在使用网站或Web应用时直接看到并与之交互的部分。它涵盖了屏幕上的一切内容,从文字、图片、按钮、布局到动画效果 一个简单的…

并发编程——11 并发容器(Map、List、Set)实战及其原理分析

1 JUC包下的并发容器Java 基础集合(如 ArrayList、LinkedList、HashMap)非线程安全。为了解决线程安全问题,Java 最初提供了同步容器(如 Vector、Hashtable、SynchronizedList),但它们通过 synchronized 实…

Circuitjs 测试点的使用

在电路中, 有时候我们想知道, 各个节点上电压的具体的值. 比如下面这个电路:电流流经两个电阻器之后, 电压在下降. 如果想知道具体节点电压的确切数值, 可以通过添加 测试点(Test Point) 实现. 点击 绘制–输出和标签–添加测试点, 之后在所需测量的节点上拖动添加一个测试点, …