溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何知道整個系統每個方法的執行時間

發布時間:2021-10-19 11:19:56 來源:億速云 閱讀:182 作者:iii 欄目:編程語言
# 如何知道整個系統每個方法的執行時間

## 引言

在軟件開發過程中,性能優化是永恒的話題。當系統出現性能瓶頸時,開發人員需要快速定位到耗時較長的代碼段。了解每個方法的執行時間是性能調優的基礎工作之一。本文將詳細介紹多種獲取方法執行時間的方案,涵蓋日志埋點、AOP、APM工具、字節碼增強等主流技術,并分析各自的優缺點和適用場景。

---

## 一、基礎方案:手動埋點計時

### 1.1 核心實現原理
```java
long start = System.currentTimeMillis();
try {
    // 業務代碼
} finally {
    long cost = System.currentTimeMillis() - start;
    System.out.println("methodA executed in " + cost + "ms");
}

1.2 優缺點分析

優點: - 實現簡單,無需引入第三方依賴 - 可精確控制需要監控的代碼段

缺點: - 代碼侵入性強,需要修改每個方法 - 大量重復代碼難以維護 - 輸出分散,需要額外收集分析

1.3 適用場景

  • 臨時性調試
  • 小型項目快速驗證

二、面向切面編程(AOP)方案

2.1 Spring AOP 實現

@Aspect
@Component
public class TimeMonitorAspect {
    
    @Around("execution(* com.yourpackage..*.*(..))")
    public Object monitor(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis();
        try {
            return pjp.proceed();
        } finally {
            System.out.println(pjp.getSignature() + " cost: " + 
                (System.currentTimeMillis() - start) + "ms");
        }
    }
}

2.2 技術要點

  1. 切入點表達式配置

    • * com.yourpackage..*.*(..) 監控指定包下所有方法
    • 支持更細粒度的過濾條件
  2. 性能數據輸出方式

    • 日志文件(建議異步寫入)
    • 消息隊列(如Kafka)
    • 時序數據庫(如InfluxDB)

2.3 優缺點對比

優勢: - 非侵入式實現 - 集中化管理監控邏輯 - 支持動態開關

局限性: - 無法監控非Spring管理的對象 - 對private方法無效 - 存在代理開銷(約5-15%性能損耗)


三、APM全鏈路監控方案

3.1 主流工具對比

工具名稱 公司 核心特性 開源協議
SkyWalking Apache 分布式追蹤、JVM監控 Apache 2.0
Pinpoint Naver 全自動探針、調用拓撲 Apache 2.0
Arthas Alibaba 運行時診斷、熱修復 GPLv3

3.2 SkyWalking 部署示例

# docker-compose.yml 配置片段
skywalking-oap:
  image: apache/skywalking-oap-server:9.4.0
  ports:
    - "11800:11800"
    - "12800:12800"

skywalking-ui:
  image: apache/skywalking-ui:9.4.0
  ports:
    - "8080:8080"

3.3 數據采集原理

  1. 字節碼增強技術(Byte Buddy)
  2. 探針自動注入方法計時邏輯
  3. 上下文傳播實現調用鏈關聯

四、JVM 內置方案

4.1 JFR(Java Flight Recorder)

# 啟動記錄
jcmd <pid> JFR.start duration=60s filename=recording.jfr

# 分析結果
jfr print --events jdk.ExecutionSample recording.jfr

4.2 關鍵事件類型

事件類型 說明
jdk.ExecutionSample 方法執行采樣
jdk.CPULoad CPU使用情況
jdk.GCHeapSummary 堆內存統計

4.3 注意事項

  • 需要商業授權(JDK11+已開源)
  • 采樣間隔影響精度(默認10ms)
  • 建議生產環境持續錄制

五、字節碼增強方案

5.1 Java Agent 實現

public class TimingAgent {
    public static void premain(String args, Instrumentation inst) {
        inst.addTransformer(new TimingTransformer());
    }
}

class TimingTransformer implements ClassFileTransformer {
    public byte[] transform(ClassLoader loader, String className, 
                          Class<?> classBeingRedefined,
                          ProtectionDomain protectionDomain,
                          byte[] classfileBuffer) {
        // 使用ASM修改字節碼
    }
}

5.2 關鍵技術點

  1. ASM字節碼操作框架
  2. 方法進入/退出指令插入
  3. 類加載過濾機制

5.3 性能影響評估

操作類型 額外耗時
方法進入記錄 50-100ns
上下文保存 200-500ns
異步上報 1-5ms(網絡)

六、生產環境實踐建議

6.1 監控策略

  1. 分層采樣
    • 核心服務:全量采集
    • 普通服務:1%采樣率
  2. 分級報警
    • >500ms:立即報警
    • 100-500ms:每日報告
  3. 趨勢分析
    • 同比/環比變化監控
    • 版本發布對比

6.2 數據可視化

推薦Grafana看板配置:

SELECT 
  method_name,
  avg(duration) 
FROM method_metrics
WHERE time > now() - 1h
GROUP BY method_name
ORDER BY avg DESC
LIMIT 20

6.3 性能優化閉環

  1. 發現瓶頸 -> 2. 優化代碼 ->
  2. 基準測試 -> 4. 上線驗證 ->
  3. 持續監控

結論

獲取方法執行時間有多種技術路線,建議根據實際場景選擇: - 開發階段:使用Arthas實時診斷 - 測試環境:AOP+日志分析 - 生產環境:APM全鏈路監控 - 深度優化:JFR+字節碼增強

隨著云原生技術的發展,eBPF等新技術正在改變性能監控的格局,但基本原理仍然相通。良好的監控體系應該像汽車的儀表盤,既能實時反映運行狀態,又能為長期優化提供數據支撐。

本文示例代碼倉庫:https://github.com/example/method-timing-demo “`

(注:實際文章約2500字,此處展示核心框架和關鍵技術點。完整版應包含更多配置示例、性能數據圖表和案例分析。)

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女