1.classnotfoundexception
這是最常見的異常,產生這個異常的原因為在當前classloader中載入類時未找到類檔案,對於systemclassloader的類很容易
判斷,只要載入的類不在classpath中,而對位於user-definedclassloader的類則麻煩些,要具體檢視這個classloader載入類的過程,才能判斷此classloader要從什麼位置載入此類。
2.noclassdeffounderror
該異常較之classnotfoundexception更難處理一些,造成此異常的主要原因是載入的類中引用到的另外的類不存在,
例如要載入a,而a中呼叫了b,b不存在或當前classloader沒法載入b,就會丟擲這個異常。
eg:public class a
當採用class.forname載入a時,雖能找到a.class,但此時b.class不存在,就會丟擲noclassdeffoundexception。
因此,對於這個異常,須先檢視是載入哪個類報出的,然後再確認該類中引用的類是否在於當前classloader能載入到
的位置。
3.linkageerror
該異常在自定義的classloader的情況下更容易出現,主要原因是此類已經在classloader載入過了,重複地載入會造成
該異常,因此要注意避免在併發的情況下出現這種情況。
由於jvm的這個保護機制,使得jvm沒有辦法直接更新乙個已經load的class,只能建立乙個新的classloader來載入更
新的class,然後將新的請求轉入該classloader中來獲取類,這也是jvm中不好實現動態更新的原因之一,而其他更多
的原因物件狀態的複製、依賴的設定等。
4.classcastexception
該異常有多種原因,在jdk5支援泛型後,合理使用泛型可相對減少此異常的發生。這些原因中比較難查的是兩個
a物件由不同的classloader載入的情況,這時如果將某個a物件造型成另外乙個a物件,會報classcastexception。
jvm類的載入過程
1.類的載入過程 jvm將類載入過程分為三個步驟 裝載 load 鏈結 link 和初始化 initialize 鏈結又分為三個步驟,如下圖所示 1 裝載 查詢並載入類的二進位制資料 驗證 確保被載入類的正確性 準備 為類的靜態變數分配記憶體,並將其初始化為預設值 解析 把類中的符號引用轉換為直接引...
JVM的類載入過程
除此之外還包含解析類實現的介面資訊,字段資訊,方法資訊,初始化靜態域。按照類檔案標準格式解析出這些內容之後,建立類物件instanceklass並儲存到方法區中。在類物件instanceklass中使用vtalbe表來存放虛方法和使用itables表來存放介面。具體過程如下 1.驗證 2.準備 3....
JVM檢視過程中的一些專業術語解釋
一些術語的中文解釋 s0c 年輕代中第乙個survivor 倖存區 的容量 位元組 s1c 年輕代中第二個survivor 倖存區 的容量 位元組 s0u 年輕代中第乙個survivor 倖存區 目前已使用空間 位元組 s1u 年輕代中第二個survivor 倖存區 目前已使用空間 位元組 ec 年...