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
英文地址,請注明出處:http://en.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) 實現. 點擊 繪制–輸出和標簽–添加測試點, 之后在所需測量的節點上拖動添加一個測試點, …