作者:暴走森;

來源:互扯程序

程序員xx:我這個任務做完了,還有什麼任務麼?

經理:咱們這個項目有些地方速度有些慢,你來優化一下!


java 診斷工具——Arthas



該說不說!小編做的這些功能,最討厭的就是優化!某些前輩大佬寫的代碼小輩我實在不敢恭維!那邏輯!那sql!

接下來!今天的主角就登場了,阿里巴巴最近開源出來的一個針對 java 的工具,主要是針對 java 的問題進行診斷---Arthas(阿爾薩斯)


java 診斷工具——Arthas



這就是使用Arthas診斷出的效率問題 [滑稽] 是不是特別爽,有了這個工具,媽媽再也不用擔心我優化問題了,哪裏慢改哪裏!




一、概述


這個工具可以協助你做下面這些事情:

  • 這個類是從哪個 jar 包加載而來的?
  • 爲什麼會報各種類相關的 Exception?
  • 線上遇到問題無法 debug 好蛋疼,難道只能反覆通過增加 System.out 或通過加日誌再重新發布嗎?
  • 線上的代碼爲什麼沒有執行到這裏?是由於代碼沒有 commit?還是搞錯了分支?
  • 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
  • 是否有一個全局視角來查看系統的運行狀況?
  • 有什麼辦法可以監控到JVM的實時運行狀態?


二、安裝方式


1.1 window 安裝方式

下載地址:http://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22com.taobao.arthas%22%20AND%20a%3A%22arthas-packaging%22

下載完成後,解壓縮,如下圖所示::


java 診斷工具——Arthas


在Download欄下載最新的 bin.zip 包,解壓後在bin目錄有 as.bat。此腳本暫時只接受一個參數 pid,即只能診斷本機上的 Java 進程。

啓動命令爲:

as.bat 


注:我在 window 10 上面啓動的時候遇到如下問題,

D:\download\arthas-packaging-3.0.4-bin>telnet
'telnet' 不是內部或外部命令,也不是可運行的程序
或批處理文件。


解決辦法爲:“控制面板” ——> “啓動或關閉Windows功能” ——> 勾選 “Telnet 功能”


java 診斷工具——Arthas


1.2 Linux 安裝方式

安裝Arthas:

curl -L https://alibaba.github.io/arthas/install.sh | sh


啓動Arthas:

./as.sh


成功啓動後,會看到如下界面。


java 診斷工具——Arthas




三、常用命令


3.1 基礎命令

  • help——查看命令幫助信息
  • cls——清空當前屏幕區域
  • session——查看當前會話的信息
  • reset——重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務端關閉時會重置所有增強過的類
  • version——輸出當前目標 Java 進程所加載的 Arthas 版本號
  • quit——退出當前 Arthas 客戶端,其他 Arthas 客戶端不受影響
  • shutdown——關閉 Arthas 服務端,所有 Arthas 客戶端全部退出
  • keymap——Arthas快捷鍵列表及自定義快捷鍵

jvm相關

  • dashboard——當前系統的實時數據面板
  • thread——查看當前 JVM 的線程堆棧信息
  • jvm——查看當前 JVM 的信息
  • sysprop——查看和修改JVM的系統屬性
  • New! getstatic——查看類的靜態屬性

class/classloader相關

  • sc——查看JVM已加載的類信息
  • sm——查看已加載類的方法信息
  • dump——dump 已加載類的 byte code 到特定目錄
  • redefine——加載外部的.class文件,redefine到JVM裏
  • jad——反編譯指定已加載類的源碼
  • classloader——查看classloader的繼承樹,urls,類加載信息,使用classloader去getResource

monitor/watch/trace相關

請注意,這些命令,都通過字節碼增強技術來實現的,會在指定類的方法中插入一些切面來實現數據統計和觀測,因此在線上、預發使用時,請儘量明確需要觀測的類、方法以及條件,診斷結束要執行 shutdown 或將增強過的類執行 reset 命令。

  • monitor——方法執行監控
  • watch——方法執行數據觀測
  • trace——方法內部調用路徑,並輸出方法路徑上的每個節點上耗時
  • stack——輸出當前方法被調用的調用路徑
  • tt——方法執行數據的時空隧道,記錄下指定方法每次調用的入參和返回信息,並能對這些不同的時間下調用進行觀測

options

  • options——查看或設置Arthas全局開關


管道

Arthas支持使用管道對上述命令的結果進行進一步的處理,如sm org.apache.log4j.Logger | grep

  • grep——搜索滿足條件的結果
  • plaintext——將命令的結果去除顏色
  • wc——按行統計輸出結果

Web Console

通過websocket連接Arthas。

  • Web Console


其他特性

  • 異步命令支持
  • 執行結果存日誌
  • 批處理的支持
  • ognl表達式的用法說明


3.2 使用示例

首先,在窗口中,輸入 help 查看一下所有提供的可用命令(他的通信本質是通過 telnet 協議來通信的),如下圖:


java 診斷工具——Arthas



這裏主要說一下 watch ,這個命令對變量進行數據監測。

首先貼上我的測試代碼:

package com.oct.tail;
import java.util.UUID;
/**
* @Author Ryan
* @Date 2018/9/18 9:58
* @desc
*/
public class OtherTestCase {
/**
*
* @return
*/
public static String uuid(){
return UUID.randomUUID().toString().replaceAll("-", "");
}
public static void main(String[] args) {
while(true){
System.out.println("uuid = " + uuid());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}


如下我做一個示例 ( 本人是基於 Window 10 , JDK 8 環境, Linux 雷同),(對於 watch 命令我假裝不知道如何使用,立即輸入 watch help 來看看會有什麼玩意兒):


java 診斷工具——Arthas



在這裏,我們針對方法 uuid() 返回值進行監測。監測結果如下:


java 診斷工具——Arthas



一目瞭然!是不是爽的起飛

4. 退出arthas


如果只是退出當前的連接,可以用quit或者exit命令。Attach到目標進程上的arthas還會繼續運行,端口會保持開放,下次連接時可以直接連接上。

如果想完全退出arthas,可以執行shutdown命令。

當然了,Arthas不只有這些功能,更多的功能請大家瀏覽官方查看詳細的用法以及命令

快上車!:

https://alibaba.github.io/arthas/sm.html


陛下...看完奏摺,點個贊再走吧!

相關文章