国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JVM 對 NoClassDefFoundError 的“緩存”

dayday_up / 419人閱讀

摘要:于是懷疑是不是對一個類的做了緩存,在第一次加載這個類出現以后,后續再嘗試加載就直接拋出。上述類的的作用是是一個空的類,里面有一個的靜態成員。

問題

今天在排查一個線上的問題,線上的一個應用在初始化一個類的靜態字段的時候出現了 NoClassDefFoundError,并且在導致 NoClassDefFoundError 出現的根本原因消失后,后續再次嘗試初始化這個類的時候,持續出現了 NoClassDefFoundError

于是懷疑 JVM 是不是對一個類的 NoClassDefFoundError 做了緩存,在第一次加載這個類出現 NoClassDefFoundError 以后,后續再嘗試加載就直接拋出 NoClassDefFoundError

實驗

為了證實自己的猜想,嘗試設計了一個簡單的實驗,一個涉及三個類

public class Test1 {
    static Test2 test2 = new Test2();
}
public class Test2 {
}
public class Test {
    public static void main(String... args) throws Exception {
        while(true) {
            System.out.println("================================");
            try {
                new Test1(); // 嘗試實例化 Test1,觸發 NoClassDefFoundError
            } catch (Throwable e) {
                e.printStackTrace();

                try {
                    Test.class.getClassLoader().loadClass("Test2"); // 嘗試加載 Test2,用于證實當將 
                                                                    // Test2.class 拷貝到 ClassPath 下的時候,
                                                                    // Test2 就可以加載到了。
                } catch (Throwable ex) {
                    ex.printStackTrace();
                }
            }
            Thread.sleep(3000);
        }
    }
}

上述類的的作用是:Test2 是一個空的類,Test1 里面有一個 Test2 的靜態成員。Test 是程序的主入口,在一個無限循環內部,不斷地嘗試去實例化 Test1,并且在加載 Test1 出現異常的時候,嘗試加載一下 Test2。

實驗的步驟是:

編譯以上類,運行 javac Test.java

將生成出的 Test2.class 重命名成 Test2.class.bak

運行 java Test,這個時候程序去加載 Test1 的時候,就會出現 NoClassDefFoundError,并且在嘗試加載 Test2 的時候,會出現 ClassNotFoundException

將第二步重命名的 Test2.class.bak 該回成 Test2.class,這個時候程序去加載 Test1 的時候,就會出現 NoClassDefFoundError,在加載 Test2 的時候,不會出現 ClassNotFoundException

實驗的第二步的目的是為了程序在加載 Test1 的時候因為找不到 Test2 出現 NoClassDefFoundError,第四步是為了和第二步做對照,說明在后續程序可以加載到 Test2 的時候,在實例化 Test1 的時候,依舊出現 NoClassDefFoundError

在我的機器上,按照上面的方式去操作,結果如下:

結果正如預期,即使在后面 Test2 在 ClassPath 下的時候,NoClassDefFoundError 依舊出現,所以 JVM 里面肯定有地方對 NoClassDefFoundError 做了緩存。

JVM 里面的實現

帶著這個疑問,請教了部門里面的 JVM 專家,這個猜測得到了證實,并且他給出了 JVM 內部具體處理這段邏輯的代碼,處理的代碼在 JDK 的 instanceKlass.cpp 這個文件里面:

bool instanceKlass::link_class_impl(
     instanceKlassHandle this_oop, bool throw_verifyerror, TRAPS) {
   // check for error state
   if (this_oop->is_in_error_state()) {
     ResourceMark rm(THREAD);
     THROW_MSG_(vmSymbols::java_lang_NoClassDefFoundError(),
                this_oop->external_name(), false);
   }
   // return if already verified
   if (this_oop->is_linked()) {
     return true;
   }

并且在 instanceClass.hpp 這個文件中,定義了類的 _init_state,其中,is_in_error_state 這個方法的定義如下:

bool is_in_error_state() const           { return _init_state == initialization_error; }

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64242.html

相關文章

  • java基礎小記

    摘要:看到的只是,而由泛型附加的類型信息對來說是不可見的。然后再加載執行類的靜態變量以及靜態語句塊。接口中基本數據類型為而抽類象不是的。本地方法接口主要是調用或實現的本地方法及返回結果。用戶自定義類加載器,在程序運行期間,通過的子類動態加載。 編譯機制  編譯主要是把?.Java文件轉換為 .class 文件。其中轉換后的 .class 文件就包含了元數據,方法信息等一些信息。比如說元數據就...

    ruicbAndroid 評論0 收藏0
  • 崩潰bug日志總結2

    摘要:出現錯誤引發崩潰日志的流程分析這個錯誤是應用的方法總數限制造成的。 目錄介紹 1.1 java.lang.ClassNotFoundException類找不到異常 1.2 java.util.concurrent.TimeoutException連接超時崩潰 1.3 java.lang.NumberFormatException格式轉化錯誤 1.4 java.lang.Illegal...

    sutaking 評論0 收藏0
  • 夯實基礎系列一:Java 基礎總結

    摘要:可實現單例模式代碼塊初始化靜態變量,只被執行一次內部類不能與外部類重名,只能訪問外部類靜態數據包括私有多分支選擇整型或字符類型變量或整數表達式開始支持。 前言 大學期間接觸 Java 的時間也不短了,不論學習還是實習,都讓我發覺基礎的重要性。互聯網發展太快了,各種框架各種技術更新迭代的速度非常快,可能你剛好掌握了一門技術的應用,它卻已經走在淘汰的邊緣了。 而學習新技術總要付出一定的時間...

    greatwhole 評論0 收藏0
  • JVM中dump出動態代理生成class

    摘要:方案一設置運行環境變量運行后會把文件生成在目錄下動態代理時生成文件缺點是只適用于動態代理方案二使用可以出中所有已加載的。 由于動態代理生成的class是直接以二進制的方式加載進內存中的,并沒有對應的.class文件生成,所以如果想通過反編譯工具查看動態代理生成的代碼需要通過特殊的手段來處理。 方案一 設置運行環境變量,運行后會把class文件生成在classpath目錄下 //動態代理...

    sherlock221 評論0 收藏0
  • Android 使用fastjson找不到fastjson包問題解決方法

    摘要:但是將導入工程后,在使用時會出現等錯誤消息。初步認為是與自帶的沖突。再運行工程,這個錯誤不再出現了,奇跡般的沒問題了。我的理解是這樣,不知道對不對,歡迎大俠指正。工程中下默認的是,而則應該是。所以按照該文的解決方法,更改就好了。 JSON解析庫有很多,諸如Jackson,Json-lib,org.json,Gson和fastjson等,但是fastjson以其解析速度最快而脫穎而出。詳...

    hiYoHoo 評論0 收藏0

發表評論

0條評論

dayday_up

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<