#1. JVM がクラス ファイルをロードする原理とメカニズムについて説明してください。
(その他のインタビューの質問の推奨事項: java の一般的なインタビューの質問)
読み込み: クラス ファイルの検索とインポート;
チェック: クラス ファイルの読み込みインポートされたクラス ファイル データの正確性;
準備: クラスの静的変数に記憶域スペースを割り当てる;
分析: シンボル参照を直接参照に変換します (このステップはオプションです)
初期化: 静的変数、静的コード ブロックを初期化し、プログラムがクラスの静的メンバーを呼び出すときに実行を開始します。これにより、静的メソッド main() が一般的なプログラムのエントリ メソッドになります。クラス コンストラクターもこのアクションをトリガーします。
2. Java にメモリ リークはありますか? 簡単に説明してください。
メモリ リークとは、プログラムで使用されなくなったオブジェクトまたは変数がメモリを占有していることを意味します。Java でのメモリ リークのシナリオは、平たく言えば、プログラマがオブジェクト。 、このオブジェクトは今後使用されなくなりますが、このオブジェクトは参照されました。つまり、このオブジェクトは役に立たないが、ガベージ コレクターによってリサイクルできません。これは Java のメモリ リークです。
(関連チュートリアルの推奨事項: java 入門チュートリアル)
外部クラスのインスタンス オブジェクトのメソッドが内部クラスのインスタンス オブジェクトを返す場合、内部クラスオブジェクトは長期参照であり、外部クラスのインスタンス オブジェクトが使用されなくなった場合でも、内部クラスは外部クラスのインスタンス オブジェクトを永続化するため、外部クラスのオブジェクトはガベージ コレクションされず、メモリ リークも発生します。 。
3. GC とは何ですか?なぜ GC があるのでしょうか?
GC とはガベージ コレクションのことで、メモリ リークを防ぎ、メモリを有効活用するために使用されます。ガベージ コレクターは通常、予期せぬ状況下で、メモリ ヒープ内の死亡したオブジェクト、または長期間使用されなかったオブジェクトをクリアしてリサイクルするために、別個の優先度の低いスレッドとして実行されます。プログラマはガベージ コレクターをリアルタイムで呼び出すことができません。オブジェクトまたはすべてのオブジェクトはガベージ コレクションされます。
4. JVM メモリ モデル (重要、GC アルゴリズム、新世代、旧世代、永続世代などを詳細に理解する必要があります)
新世代:新しいオブジェクトは、メモリの割り当てに新しい世代が使用されます。Eden スペースが不十分な場合、生き残ったオブジェクトは Survivor に転送されます。新しい世代のサイズは、-Xmn で制御できます。または、-XX:SurvivorRatio を使用して、 Eden と Survivor の比率
古い世代: 複数のガベージ コレクション後もまだ生き残っているオブジェクトを新しい世代に格納するために使用されます
永続性: 主にロードされたすべてのクラス情報、メソッド情報を格納するメソッド領域を実装します。 、定数プールなど。
-XX:PermSize および -XX:MaxPermSize を通じて、永続的なバンドの初期値と最大値を指定できます。パーマネント スペースはメソッド領域と同じではありません。ホットスポット JVM がメソッド領域を実装するためにパーマネント スペースを使用するだけです。一部の仮想マシンにはパーマネント スペースがなく、メソッド領域を実装するために他のメカニズムが使用されます。
Mark-Compact
このアルゴリズムは、「マーククリア」アルゴリズムと「コピー」アルゴリズムの利点を組み合わせたものです。これも 2 つのステージに分かれており、第 1 ステージでは、ルート ノードから始まるすべての参照オブジェクトにマークが付けられ、第 2 ステージではヒープ全体を走査し、マークされていないオブジェクトがクリアされ、生き残ったオブジェクトがヒープの 1 つに「圧縮」され、順番に排出されます。このアルゴリズムは、「マーク アンド スイープ」の断片化の問題を回避し、「コピー」アルゴリズムのスペースの問題も回避します。
(関連ビデオチュートリアルの推奨事項: java コース)
5. GC の動作原理
GC は各オブジェクトを通過します。参照カウント属性があり、参照が追加されるとカウントが1増加し、参照が解放されるとカウントが1減少します。カウントが0の場合はリサイクル可能です。GCはバックグラウンドデーモンプロセスです。 Java プログラマの皆さん、new キーワードはオブジェクトを割り当てるために使用されます。
オブジェクトを解放するとき、プログラムがオブジェクトにアクセスできないようにオブジェクトへのすべての参照が null に割り当てられている限り、オブジェクトを呼び出します。 「到達不能」。GC はすべての「到達不能」オブジェクトをリサイクルする責任を負います。オブジェクトのメモリ空間に到達します。
GC の場合、プログラマがオブジェクトを作成すると、GC はオブジェクトのアドレス、サイズ、使用状況の監視を開始します。通常、GC は有向グラフを使用して、ヒープ内のすべてのオブジェクトを記録および管理します。このようにして、どのオブジェクトが「到達可能」でどのオブジェクトが「到達不能」であるかが判断され、一部のオブジェクトが「到達不能」であると GC が判断した場合、GC はこれらのメモリ空間を再利用する必要があります。
ただし、GC をさまざまなプラットフォームに実装できるようにするために、Java 仕様では GC の多くの動作を厳密に規定していません。たとえば、どのような種類のリサイクルアルゴリズムを使用するか、いつリサイクルを実行するかなどの重要な問題について明確な規制はありません。したがって、JVM 実装者が異なれば、実装アルゴリズムも異なることがよくあります。これは、Java プログラマーの開発に多くの不確実性をもたらします。
以上が長年の開発経験からまとめられた Java 面接の質問—(5)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。