1. 程式人生 > >java 診斷工具—— Arthas

java 診斷工具—— Arthas

程式設計師xx:我這個任務做完了,還有什麼任務麼?

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

640?wx_fmt=jpeg

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

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

640?wx_fmt=png

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

640?wx_fmt=jpeg

一、概述

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

  • 這個類是從哪個 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

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

640?wx_fmt=png

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

啟動命令為:

as.bat <pid>

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

D:\download\arthas-packaging-3.0.4-bin>telnet
'telnet' 不是內部或外部命令,也不是可執行的程式
或批處理檔案。

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

640?wx_fmt=png

1.2 Linux 安裝方式

安裝Arthas:

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

啟動Arthas:

./as.sh

成功啟動後,會看到如下介面。

640?wx_fmt=png

三、常用命令

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 協議來通訊的),如下圖:

640?wx_fmt=png

這裡主要說一下  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 來看看會有什麼玩意兒):

640?wx_fmt=png

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

640?wx_fmt=png

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

4. 退出arthas

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

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

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

快上車!:

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

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

推薦閱讀

博主11年java開發經驗,現從事智慧語音工作的研發,關注微信公眾號與博主進行技術交流!更過乾貨資源等你來拿!

640?wx_fmt=jpeg

640?wx_fmt=png