インタビュアー: クラスロードプロセスについて教えてください (10 個の図)
##Loading
クラスを使用したいときは、次のことを行う必要があります。 ClassLoader を通じてクラスをメモリにロードします。「クラスのロード フェーズでは、主に次の 3 つのことを完了します。」
- クラス全体を通じてクラスを取得します。 name
- のバイナリ ストリームは、クラスのバイナリ ストリームを解析し、メソッド領域 のデータ構造の java.lang.Class クラスのインスタンスを作成します。
- . メソッド領域のこのクラスのアクセス エントリとして、このタイプを示します。

"のメソッド完全なクラス名によるクラスのバイナリ ストリームの取得はさまざまです。「
- zip パッケージから取得します。
- Get」ネットワークからのデータ ##動的プロキシ テクノロジなどのランタイム計算生成
- ....
- # "非配列型の読み込みフェーズの場合、Java 仮想マシンの組み込みクラス ローダーを使用して完了することも、ユーザー定義のクラス ローダーを使用して完了することもできます「
リンク
「リンクのこの段階は、主に検証、準備、分析の 3 つの部分に分かれています。」
検証
「検証フェーズの主な目的は、クラス ファイルの形式が正しく、実行時に仮想マシンのセキュリティが危険にさらされないことを確認してください。"
検証フェーズには多くのルールがありますが、大きく分けて次の 4 つがあります。ステージ「具体的な内容については、詳しくは説明しません。「Java仮想マシンを深く理解する」を参照してください。この記事は、概要を作成し、全体的なプロセスを把握することを目的としています。詳細については説明せずに、クラスのロードについて説明します。"
準備
「準備フェーズでは主にクラスの静的変数にメモリを割り当て、それらをデフォルト値に初期化します。」
一般的なデータ型のデフォルト値は次のとおりです
データ型 | デフォルト値 |
---|---|
バイト | (バイト)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
ブール値 | false |
char | '\u0000' |
参照 | null |
「クラス静的変数のフィールド属性テーブルに ConstantValue 属性が存在する場合、代入ステートメントは直接実行されます。」
では、どのような状況でフィールドが実行されるのかクラスの静的変数の属性テーブルは存在しますか? ConstantValue プロパティはどうですか?
クラス静的変数は基本データ型であり、final によって変更されます クラス静的変数は文字列型であり、final によって変更されます、および量の形式のリテラル割り当てです。
クラス ファイルのバイトコードを簡単に表示するために、IDEA にプラグイン jclasslib バイトコード ビューアをダウンロードしました。これは非常に便利です。 。次のコードを使用して、バイトコードの形式で検証します
public class Person { private static int age = 10; private static final int length = 160; private static final String name = "name"; private static final String loc = new String("loc"); }
「したがって、長さと名前の属性には、準備段階で ConstantValue で指定された値が割り当てられます」
「それでは、age 属性と loc 属性はどの段階で割り当てられるのでしょうか? それは初期化段階であり、後で詳しく説明します。」
分析
「クラス、インターフェイス、フィールドの (定数プール内の) シンボリック参照を変換する」およびメソッドを直接参照に追加します。" シンボリック参照: 一連のシンボルを使用して、参照されるターゲットを説明します。 直接参照; ターゲットへの直接ポインタ
参加して次のようなクラスを作成してください
public class Student { private String name; private int age; public String getName() { return this.name; } }
フィールドを例にとると、名前と年齢に対応するオブジェクトは直接ポイントしません。メモリ アドレスの代わりに、文字列を使用して記述します (つまり、シンボリック参照)。解析段階では、これらの記述をターゲットを直接指すポインター (つまり、直接参照) に変換します。
初始化
「执行类静态成员变量赋值语句和静态代码块中的语句」

我们把上面的Student代码改成如下形式
public class Student { private String name; private int age = 10; private static int gender = 1; { System.out.println("构造代码块"); } static { System.out.println("静态代码块"); } public Student() { System.out.println("构造函数"); } public String getName() { return this.name; } }
可以看到字节码中包含了3个方法,getName方法我们知道,从字节码的角度分析一波
「

从字节码可以看到
调用父类的 方法 非静态成员变量赋值 执行构造代码块 执行构造函数
「
从字节码可以看到
静的変数の代入ステートメントを実行します。 静的コード ブロック内のステートメントを実行します。 One注意すべき点 はい、 「Java 仮想マシンは、サブクラスの メソッドが実行される前に、親クラスの メソッドが実行されていることを確認します。」
# #「面接の質問によっては、静的コード ブロック、構築コード ブロック、コンストラクターの実行順序についてよく尋ねられるため、
##静的コード ブロックと静的メンバー変数、実行順序は書き込み順序によって決まります (一度だけ実行されます)
- コード ブロックと非静的コード ブロックを構築しますメンバ変数の場合、実行順序は書き込み順序によって決まります
- Constructor
- ##「継承を伴う実行順序」
#親クラス static (静的コード ブロック、静的メンバー変数)、サブクラスの static (静的コード ブロック、静的メンバー変数) (1 回のみ実行されます)
- 親クラスの非静的 (コンストラクター) コード ブロック、非静的メンバー変数)、親クラスのコンストラクター
- 非静的サブクラス (構築コード ブロック、非静的メンバー変数)静的メンバー変数)、サブクラスのコンストラクター
- アンインストール
ガベージ コレクションは、ヒープだけでなくメソッド領域にも含まれます。ただし、メソッド領域の型データを再利用するための条件は比較的厳しいです。下図は一例です。メソッド領域の Simple クラスを再利用したいです。
ヒープ内の Sample クラスとそのサブクラスがリサイクルされていることを確認する必要があります
-
Sample クラスをロードする MyClassLoader がリサイクルされました Sample クラスに対応する Class オブジェクトがリサイクルされています

メソッド領域に型データのリサイクル条件が設定されていることがわかります。比較的厳密ですが、その影響は最小限であるため、一部のガベージ コレクターはメソッド領域の型データをリサイクルしません
#概要#クラスロード処理
変数代入処理
##
以上がインタビュアー: クラスロードプロセスについて教えてください (10 個の図)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Spring について知っている必要があるので、Aop のすべての通知の順序について話しましょう。Spring Boot または Spring Boot 2 は AOP の実行順序にどのように影響しますか? AOP で遭遇した落とし穴について教えてください。

OOM は、プログラムに脆弱性があることを意味します。これは、コードまたは JVM パラメータ設定が原因である可能性があります。この記事では、Java プロセスが OOM をトリガーした場合のトラブルシューティング方法について読者に説明します。

Java並行プログラミングシリーズの番外編「C A S (Compare and swap)」は、絵と文章でわかりやすく、インタビュアーと夢中で会話できるスタイルを保っています。

「先週、グループの友人が平安保険の面接に行きました。結果は少し残念でした。非常に残念ですが、落ち込まないでほしいと思います。あなたが言ったように、基本的には、ここで出た質問はすべて解決しました」面接は面接の質問を暗記すれば解けますので、頑張ってください!

多くの企業の筆記試験の問題には落とし穴があり、うっかり陥る可能性がありますので、甘く見ないでください。サイクルに関するこの種の筆記試験問題に遭遇した場合は、冷静に考えて段階的に解答することをお勧めします。

この記事では、Java String クラスに関する 5 つの面接の質問を取り上げます。私は面接プロセス中にこれら 5 つの質問のうちのいくつかを個人的に経験しました。この記事は、これらの質問に対する答えがなぜこのようになるのかを理解するのに役立ちます。

この記事は合計 30,000 語以上あり、Linux の概要、ディスク、ディレクトリ、ファイル、セキュリティ、構文レベル、実戦、ファイル管理コマンド、文書編集コマンド、ディスク管理コマンド、ネットワーク通信コマンド、システム管理コマンド、バックアップをカバーしています。圧縮コマンドなど Linux のナレッジポイントを分解します。
