JVM類載入過程中丟擲的常見異常

2021-05-28 13:36:15 字數 1020 閱讀 2003

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 年...