類裝入器負責把類裝入 Java 虛擬機(JVM)
在這個系列的文章中
類裝入基礎
這一節描述類裝入的核心概念
類裝入器委托
類裝入器委托模型 是把裝入請求相互傳給對方的類裝入器圖
緩存(Cache)
父類(Parent)
自己(Self)
類裝入器首先判斷要求它裝入的類是否與過去裝入的類相同ClassNotFoundException
)
因為父類類裝入器總是先得到裝入類的機會java
)的正確版本
圖
圖
與其他類裝入器不同
擴展(extension) 類裝入器(也稱作標准擴展 類裝入器)是引導類裝入器的一個孩子
系統(system) 類裝入器(也稱作應用程序 類裝入器)負責從 CLASSPATH 環境變量指定的路徑裝入代碼
類路徑選項
表
命令行選項
解釋
涉及的類裝入器
引導
類裝入的階段
類的裝入實際上可以分成三個階段
雖然不是所有的問題
圖
裝入 階段包括
鏈接 是三個階段中最復雜的一個
字節碼驗證
類准備
解析
超類
接口
字段
方法簽名
方法中使用的本地變量
在初始化 階段
在這三個階段末尾
顯式裝入與隱式裝入
類裝入的方式有兩種 —— 顯式 或 隱式
顯式 類裝入發生在使用以下方法調用裝入的類的時候
cl
Class
當調用其中一個方法的時候
隱式 類裝入發生在由於引用
類的裝入通常組合了顯式和隱式類裝入
JVM 的調試特性
前面一節介紹了類裝入的基本原則
詳細輸出
可以用
解釋詳細輸出
詳細輸出列出已經打開的所有 JAR 文件
[Opened D:\jre\lib\core
[Opened D:\jre\lib\graphics
所有裝入的類都已經列出
[Loaded java
[Loaded java
[Loaded java
詳細類輸出顯示額外信息
[Loaded HelloWorld from file:/C:/myclasses/]
[Loading superclass and interfaces of HelloWorld]
[Loaded HelloWorldInterface from file:/C:/myclasses/]
[Loading superclass and interfaces of HelloWorldInterface]
[Preparing HelloWorldInterface]
[Preparing HelloWorld]
[Initializing HelloWorld]
[Running static initializer for HelloWorld]
詳細輸出還顯示一些內部拋出的異常(如果發生的話)
用
詳細輸出有助於解決類路徑問題
IBM 詳細類裝入
知道類裝入器在哪裡尋找類
這個選項也可用於用戶定義的類裝入器
解釋 IBM 詳細類裝入的輸出
IBM 詳細類裝入的輸出顯示了要裝入指定類的類裝入器以及它們查找的位置
java
在這裡MainClass
在它的主方法中引用了 ClassToTrace
在列出類裝入器的時候
請注意
的類裝入器才有輸出
用 IBM 詳細類裝入解決問題
IBM 詳細類裝入選項是檢查所有類裝入器設置的類路徑的好方法
Javadump
Javadump(也稱為 Javacore)是另一個很有用的 IBM 診斷工具
發生致命的本機異常
JVM 用光了堆空間
向 JVM 發送了一個信號(例如
調用了
com ibm jvm Dump JavaDump()
方法
觸發 Javadump 的時候
解釋 Javadump 中的類裝入部分
Javadump 文件中提供的確切信息取決於 JVM 在哪個平台上運行
定義的類裝入器和它們之間的關系
每個類裝入器裝入的類的列表
以下是從 Javadump 提取的類裝入器信息的快照
CL subcomponent dump routine
============================
Classpath Z(D:\jre\lib\core
Oldjava mode false
Bootstrapping false
Verbose class dependencies false
Class verification VERIFY_REMOTE
Namespace to classloader
Start of cache entry pool
Start of free cache entries
Location of method table
Global namespace anchor
System classloader shadow
Classloader shadows
Extension loader
System classloader
Classloader summaries
Shadow
Parent sun/misc/Launcher$ExtClassLoader(
Number of loaded classes
Number of cached classes
Allocation used for loaded classes
Package owner
Shadow
Parent *none*(
Number of loaded classes
Number of cached classes
Allocation used for loaded classes
Package owner
p
Number of loaded classes
Number of cached classes
Allocation used for loaded classes
Package owner
ClassLoader loaded classes
Loader sun/misc/Launcher$AppClassLoader(
HelloWorld(
Loader sun/misc/Launcher$ExtClassLoader(
Loader *System*(
java/io/WinNTFileSystem(
java/lang/Throwable(
java/lang/IndexOutOfBoundsException(
java/lang/UnsatisfiedLinkError(
[Ljava/lang/Class;(
java/io/InputStream(
java/lang/Integer$
java/util/Dictionary(
在這個示例中
系統類裝入器(
sun/misc/Launcher$AppClassLoader
)
擴展類裝入器(
sun/misc/Launcher$ExtClassLoader
)
引導類裝入器(
*System*
)
Classloader 匯總部分提供了系統中每個類裝入器的細節
類裝入器裝入的類部分列出了每個類裝入器裝入的類HelloWorld
(在地址
上)
用 Javadump 解決問題
使用 Javadump 提供的信息ClassNotFoundException
異常)
可以用 Javadump 診斷的其他類型的問題包括
類裝入器命名空間問題
NoClassDefFoundError
異常)類裝入器約束問題
Java 方法跟蹤
IBM JVM 有一個內置的方法跟蹤工具
啟動跟蹤的選項取決於 JVM 的發行版
在 IBM Java
java thods=java/lang/ClassLoader
跟蹤 ClassLoader
中的 loadClass()
方法和 HelloWorld
中的方法
解釋方法跟蹤的輸出
這裡 是方法跟蹤輸出的一個示例(用前面一段的第二個命令行)
跟蹤的每一行都提供了比上面顯示的更多的信息
This =
/lang/Class;
這個跟蹤包括
: :
x A C
D
余下的信息顯示是進入(
>
)還是退出了(<
)方法 用方法跟蹤解決問題
可以用方法跟蹤解決不同類型的問題
性能熱點
掛起
錯誤對象
意外的代碼路徑
其他錯誤
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26487.html