newキーワードに何のシリーズ(一)クラスロードが発生しましたか


0 x 01クラスロードプロセス
≪ロード|Load|emdw≫
目的:classファイルは、ファイル、ネットワークで取得してもバイナリストリームに変換されてメモリにロードされます.
  • クラスのフルリミット名によりクラスのバイナリストリーム
  • を取得する.
  • バイトストリームが表す静的記憶構造を のランタイムデータ構造(ここではjavaメモリ構造に関するメソッド領域)
  • に変換する.
  • メモリには、 というクラスの各種データアクセスエントリ
  • としてクラスを表すClassオブジェクトが生成する.
    ここではclassファイルがロードされた後にメモリ構造に置かれたメソッド領域がわかります.同時にjvmはクラスオブジェクトのインスタンスを自動的にインスタンス化し、このインスタンスがどこに配置されるかは、特定の仮想マシンによって決定され、hotspotはメソッド領域に配置されます.
    検証#ケンショウ#
    目的:classファイルのバイトストリームに含まれる情報が現在の仮想マシンの要件に合致し、安全であることを確認する
    この段階から,その実験的検証段階はロード段階の開始時に混在して開始したことがわかる.
    このフェーズでは、次の検証が行われます.
  • ファイルフォーマット検証:バイトストリームがClassファイルフォーマット仕様
  • に適合するかどうか
  • メタデータ検証:バイトコード記述情報の意味解析(クラス、フィールド、メソッドなどの言語フォーマットの検証)
  • .
  • バイトコード検証:データストリームと制御ストリームを検証し、意味が論理に合致しているかどうかを決定する(if-elseが間違っているかどうか)
  • シンボル参照検証:仮想マシンがシンボル参照を直接参照に変換してエラーが発生したかどうかを確認する(NoSuchMethod例外はここで発生する)
  • .
    の準備を
    目的:クラス変数にメモリを割り当て、intのデフォルト初期値が0のような対応するタイプのデフォルト初期値を指すクラス変数の初期値を設定します.
    final修飾の値はこの段階で直接付与されます
    // i        0
    public static int i = 123;
    // j        123
    public final static int j = 123;
    

    解析
    目的:定数プール内のシンボル参照を直接参照に置き換えるプロセス
    このフェーズでは、次の解析が行われます.
  • クラスまたはインタフェースの解析
  • バイト解析
  • クラスメソッド解析
  • インタフェースメソッド解析
  • このフェーズは、解析フェーズにおいてもNoSuchMethodなどの類似のエラーが発生するなど、検証フェーズで比較できます.シンボル参照まで実行できます.
    初期化
    目的: 初期化の値を除去し、残りはこの段階で初期化、すなわちクラスコンストラクタを実行するプロセス
    clinitメソッドは、コンパイラがクラス内のすべてのクラス変数を自動的に収集する付与動作と、静的文ブロック内の文のマージによって生成されます.そのため、主に初期化クラスのstatic変数とfinal変数です.
    このフェーズでは、次の操作を行います.
  • サブクラスclinitメソッドを呼び出す前に、親クラスclinitメソッドを呼び出すことを保証する(インタフェースの親クラスのclinitは呼び出さない)
  • .
  • 静的文割付および静的文ブロック
  • を順次統合する.
  • clinitは必須ではありません
  • clinitはマルチスレッド環境でロック、同期
  • であることを保証する.
    0 x 02クラスとクラスローダ
    各クラス・ローダには独立したネーミング・スペースがあるため、各クラス・ローダがロードするクラスは同じクラスではありません.
    クラス・ローダ:
  • 起動クラスローダ
  • 拡張クラスローダ
  • アプリケーションクラスローダ
  • 0 x 03クラスロードメカニズム ;クラスのロードは、クラスの親クラスローダに渡されます.親ローダがロードできない場合は、サブローダに渡されます.
    破壊 :
  • loadClassを書き換えると親委任モデルが乱れ、findClass
  • を書き換えることをお勧めします.
  • ThreadContextClassLoader:上位クラスのローダがサブクラスのローダをロードできるようにするclass
  • コード熱交換、モジュール熱配置
  • 0 xPS 1類初期化タイミング
                    
    

    初期化がトリガーされた場合:
  • は、new、getstatic、putstatic、invokestaticの4つの命令(newキーワード、静的変数の取得または設定、静的メソッドの呼び出し、finalを除く)
  • に遭遇する.
  • java.lang.reflectパケットの反射メソッドを使用して呼び出されたとき
  • クラスの初期化親が初期化していないことを発見すると、初期化親(インタフェースはできません)
  • メインクラス(mainメソッドのあるクラス)
  • を実行
  • jdk 1.7で動的言語がサポートされている場合
  • 初期化はトリガーされません(誤解されやすい):
  • 静的サブクラスの静的親クラスの静的変数を呼び出すと、静的サブクラスの初期化
  • はトリガーされません.
  • 配列定義クラスは、初期化
  • をトリガーしません.
  • final定数参照は
  • をトリガーしません.
    0 xFFまとめ
    newの最初の段階でお話ししたいのはクラスロードについてです.配列のロード、tomcatのオーソドックスクラスロードメカニズム、OSGiフレキシブルクラスロードメカニズム、バイトコード生成技術など、多くの詳細があります.