首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 執行緒執行堆疊資訊獲取演進歷程

     編輯:Java 相關知識

問題引入

使用日誌功能(JDK Log 或 Log4J)時,日誌系統自動列印豐富資訊,格式如:[運行時間] [當前類名] [方法名] INFO: [用戶資訊]。例如 Tomcat 啟動資訊:Jul 9, 2004 11:22:41 AM org.apache.coyote.http11.Http11Protocol start INFO: Starting Coyote HTTP/1.1 on port 8080。類名與方法名非用戶手動添加,而是日誌系統自動判斷當前執行語句所屬類別與方法。這是如何做到的?

演進歷程

JDK 1.3 時代:解析 StackTrace 字串

Throwable.printStackTrace() 調用 native printStackTrace0(),無法直接在 Java 程式碼中使用。唯一辦法:建立 new Throwable() 獲取堆疊追蹤字串,自行解析提取所需資訊。Log4J 1.2 即採此法:t.printStackTrace(pw) 獲取字串,解析第 5 行(跳過 Log4J 內部 4 層調用)獲取呼叫者類名、方法名、檔名、行號。

JDK 1.4:引入 StackTraceElement

為免解析字串麻煩,JDK 1.4 引入 StackTraceElement 類別,包含 declaringClass、methodName、fileName、lineNumber。JDK 1.4 Log 實作:(new Throwable()).getStackTrace() 獲取陣列,搜尋 Logger 類別後的第一個框架即為呼叫者。Log4J 1.3 alpha 兼容兩者:判斷平台支援 StackTraceElement 時用 StackTraceElementExtractor,否則用 LegacyExtractor。

JDK 1.5:Thread 類別新增堆疊追蹤方法

JDK 1.5 在 Thread 類別引入 getStackTrace() 與 getAllStackTraces() 兩方法。無需 (new Throwable()).getStackTrace(),可調用 Thread.currentThread().getStackTrace() 獲取當前執行緒堆疊資訊。權限允許時還可獲取其他執行緒堆疊資訊。getStackTrace() 回傳 StackTraceElement[],第一個元素為堆疊頂端(最近方法呼叫),最後一個為底部。getAllStackTraces() 回傳所有存活執行緒堆疊追蹤的 Map。

總結

從總體發展趨勢看,JDK 不僅提供越來越多、越來越強功能,且暴露給用戶的控制方法越來越多、越來越強大。

文章來源:https://blog.csdn.net/buaawhl/archive/2005/01/18/257653.aspx

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved