ClassLoader が Java バイトコードをロードするとき、バイトコードは最初にベリファイアによって検証されます。バリデーターは、命令では実行できない明らかに破壊的な操作をチェックする責任があります。
バリデーターによって実行された操作を確認します。
-
変数は使用前に初期化されます。
-
メソッド呼び出しとオブジェクト アプリケーション タイプの間の一致。
-
プライベートデータおよびメソッドにアクセスするためのルールには違反しません。
-
ローカル変数へのアクセスはすべてランタイム スタック上にあります。
-
ランタイムスタックはオーバーフローしません。
JVM にこのチェックを実行させたくない場合は、 noverify
パラメータを追加できます。
JDK 13 以降のバージョンの問題
-Xverify:none
JDK 13 以降のバージョンでは、およびパラメータは非推奨になりました -noverify
。
そうしないと、次のエラーが表示されます。
warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
OpenJ9 を使用している場合は、次のエラーが発生します。
JVMJ9VM193W Since Java 13 -Xverify:none and -noverify were deprecated for removal and may not be accepted options in the future.
警告の理由は、JDK が 13 以降のバージョンを使用しているにもかかわらず、-noverify
実行パラメータを引き続き使用しているためです。
JVM の実行中に上記のパラメータをキャンセルする必要があります。
クラスがロードされるとき、クラスが正しいことを確認するのに時間がかかります。クラスは遅延してロードされる可能性があるため (アプリの起動時ではなく、最初の使用時に)、予期しない実行時の遅延が発生する可能性があります。
実際、クラスは通常チェックする必要はありません。コンパイラは無効なバイトコードやクラス構造を生成しません。検証する理由は、クラスがシステム上に構築され、オンラインでホストされ、保護されていないインターネット経由で送信される可能性があるためです。
このパスでは、悪意のある攻撃者がバイトコードを変更し、コンパイラーが決して作成しないもの、つまり JVM をクラッシュさせたり、セキュリティ制限をバイパスしたりする可能性のあるものを作成する可能性があります。したがって、クラスを使用する前に検証してください。これがネイティブ アプリケーションの場合、通常はバイトコードを再度チェックする必要はありません。