序文 見落とされがちな、典型的な JVM 面接の質問を 10 個まとめました。読んでいただきありがとうございます。さあみんな! githubアドレス、星をありがとう https://github.com/whx123/JavaHome 1. オブジェクトはヒープ内に割り当てる必要がありますか?脱出解析技術についてご存知ですか? 「オブジェクトは必ずヒープ内に割り当てられますか?」必ずしもそうではありません。 「エスケープ分析」を通じて、JVM はメソッドから脱出できないオブジェクトをスタックに割り当てます。 エスケープ分析とは何ですか? エスケープ分析は、Java プログラムの同期負荷とメモリ ヒープ割り当ての圧力を効果的に軽減できる、関数間グローバル データ フロー分析アルゴリズムです。エスケープ分析を通じて、Java Hotspot コンパイラは新しいオブジェクト参照の使用範囲を分析し、オブジェクトをヒープ内に割り当てるかどうかを決定できます。 エスケープ解析とは、ポインタの動的範囲を解析する方法を指し、コンパイラの最適化原則のポインタ解析と形状解析に関連しています。変数 (またはオブジェクト) がメソッド内に割り当てられると、そのポインターが返されるか、グローバルに参照され、その後他のメソッドまたはスレッドによって参照されることがあります。この現象はポインタ(または参照)エスケープと呼ばれます。簡単に言えば、オブジェクトへのポインターが複数のメソッドまたはスレッドによって参照されている場合、そのオブジェクトへのポインターがエスケープしたと言えます。 脱出分析の例
脱出分析の利点
2. 仮想マシンが Permanent Generation ではなく Metaspace を使用するのはなぜですか? 「メタスペースとは何ですか? 永久世代とは何ですか? 永久世代ではなくメタスペースを使用するのはなぜですか?」まず「メソッド領域」を確認し、次のように仮想マシン ランタイムのデータ メモリ図を見てみましょう。 メソッド領域は、ヒープと同様に、すべてのスレッドで共有されるメモリ領域です。クラス情報、定数、静的変数、ジャストインタイムでコンパイルされたコード、および仮想マシンによってロードされたその他のデータを保存するために使用されます。 「永久世代とは何ですか?それはメソッド領域とどのように関係していますか?」 HotSpot 仮想マシン上で開発および展開された場合、多くのプログラマーはメソッド領域を永続世代と呼びます。メソッド領域は仕様であり、永続世代は Hotspot によるこの仕様の実装であると言えます。 Java 7 以前のバージョンでは、メソッド領域は永続世代に実装されています。 「Metaspace とは何ですか? メソッド領域とどのように関係しますか?」 Java 8 では、HotSpots は永続的な生成をキャンセルし、Metaspace に置き換えました。つまり、メソッド領域はそのままですが、実装が永続生成からメタスペースに変わりました。 「なぜ PermGen ではなく Metaspace を使用するのですか?」
「永久世代」のサイズは、次の2つのパラメータによって設定されます。
「永続世代」の場合、多くのクラスが動的に生成されると、永続世代のスペース構成が制限されるため、「java.lang.OutOfMemoryError: PermGen スペース エラー」が発生する可能性が高くなります。最も典型的なシナリオは、Web 開発に多くの JSP ページがある場合です。
メタスペースのサイズは、次のパラメータを使用して設定できます。
「では、なぜ PermGen ではなく Metaspace を使用するのでしょうか?」 表面的には、これは OOM 例外を回避するためです。永続世代のサイズは通常、永続世代の上限を決定する PermSize と MaxPermSize を使用して設定されますが、どのくらいの大きさに設定すればよいかは必ずしもわかっていません。デフォルト値を使用すると、OOM エラーが発生しやすくなります。 Metaspace を使用する場合、ロードできるクラス メタデータの量は、MaxPermSize ではなく、システム上の実際の使用可能なスペースによって制御されるようになります。 3. Stop The Worldとは何ですか? OopMapとは何ですか?安全ポイントとは何ですか? ガベージコレクションのプロセスにはオブジェクトの移動が含まれます。オブジェクト参照の更新の正確性を確保するには、すべてのユーザー スレッドを一時停止する必要があります。仮想マシンの設計者は、このような一時停止を「Stop The World」と表現します。 HotSpotには、「OopMap」と呼ばれるデータ構造(マッピングテーブル)があります。クラスのロードアクションが完了すると、HotSpot はオブジェクト内のどのオフセットにどのタイプのデータがあるかを計算し、それを OopMap に記録します。ジャストインタイム コンパイル プロセス中に、スタック上およびレジスタ内のどの場所が参照であるかを記録するために、OopMap も「特定の場所」に生成されます。 具体的な場所は次のとおりです。
これらの場所は「セーフポイント」と呼ばれます。ユーザー プログラムの実行中は、一時停止することはできず、コード命令ストリーム内の任意の場所でガベージ コレクションを開始できますが、一時停止するには安全なポイントまで実行する必要があります。 4. JVM の主なコンポーネントとその機能は何ですか? JVMは2つのサブシステムと2つのコンポーネントで構成されています。
まず、Java ソースコードはコンパイラによってバイトコードに変換され、その後クラスローダーがバイトコードをメモリにロードしてランタイムデータ領域のメソッド領域に配置します。バイトコード ファイルは、JVM の命令セット仕様のセットに過ぎず、実行のために基盤となるオペレーティング システムに直接渡すことはできません。したがって、バイトコードを基礎となるシステム命令に変換し、それを CPU に渡して実行するために、特定のコマンド パーサー実行エンジンが必要です。このプロセスでは、プログラム全体の機能を実装するために、他の言語のネイティブライブラリインターフェース(ネイティブインターフェース)を呼び出す必要があります。 5. デーモン スレッドとは何ですか?デーモン スレッドと非デーモン スレッドの違いは何ですか?デーモンスレッドの機能は何ですか? 「デーモン スレッド」はユーザー スレッドとは異なります。 「ユーザー スレッド」は手動で作成するスレッドですが、デーモン スレッドはプログラムの実行中にバックグラウンドで提供される「一般的なサービス スレッド」です。ガベージ コレクション スレッドは、典型的なデーモン スレッドです。 「デーモン スレッドと非デーモン スレッドの違いは何ですか?」例で見てみましょう〜
操作結果: デーモンスレッドとしてマークした後、「メインスレッドの破棄が停止し、デーモンスレッドも一緒に破棄される」ことがわかります。 t1.setDaemon(true) デーモン フラグを削除した場合の効果を見てみましょう。
そのため、メインスレッドが終了すると、JVM も終了し、無限ループであっても、デーモンスレッドが同時にリサイクルされます。ユーザー スレッドの場合は、常に無限ループで実行されます。これがデーモン スレッドと非デーモン スレッドの違いです。 デーモンスレッドには「自身のライフサイクルを自動的に終了する」機能がありますが、非デーモンスレッドにはその機能がありません。ガベージ コレクション スレッドが非デーモン スレッドである場合、JVM を終了したいときに、ガベージ コレクション スレッドがまだ実行されているためプログラムを終了できず、非常に困った状況になります。このため、ガベージ コレクション スレッドはデーモン スレッドである必要があります。 6.WeakHashMap について聞いたことがありますか?どのように機能しますか? 「WeakHashMap」はHashMapに似ていますが、WeakHashMapのキーは「弱参照」キーです。 「弱参照」といえば、ここで4種類の参照について確認してみましょう。
WeakHashMap が弱参照を使用するからこそ、「そのオブジェクトはいつでもリサイクルされる可能性がある」のです。 WeakHashMap クラスの動作は、ガベージ コレクターの動作に部分的に依存します。 size() メソッドへの 2 回の呼び出しが異なる値を返したり、isEmpty() への 2 回の呼び出しがそれぞれ true と false を返す可能性があります。 WeakHashMap の「動作原理」は、次の 2 つの点に答えます。
WeakHashMap 内の Entry は弱参照である WeakReference を継承しているため、「いつでもリサイクルできる」という弱参照の特性を持ちます。ソースコードを見てみましょう:
「WeakHashMap はどのようにして Entry を削除するのですか?」 GC がオブジェクトをクリーンアップするたびに、参照されたオブジェクトは ReferenceQueue に配置され、その後キューが走査されて削除されます。 WeakHashMap の追加、削除、変更、およびクエリ操作は、expungeStaleEntries() メソッドを直接的または間接的に呼び出して、期限切れのエントリを適時にクリアします。 expungeStaleEntries のソースコードを見ることができます:
7. Java 構文シュガーについてご存知ですか? Java でよく使用される 12 個の構文シュガーは何ですか? 糖衣構文とも呼ばれる構文糖は、プログラムをより簡潔で読みやすくします。 Java で最も一般的に使用される構文糖衣には、ジェネリック、可変長パラメータ、条件付きコンパイル、自動アンパックとパック、内部クラスなど 12 種類が含まれます。
8. ポインターバンプとは何ですか?フリーリストとは何ですか? TLAB とは何ですか? 通常、JVM オブジェクトはヒープ メモリに配置されます (エスケープ分析が行われる場合を除く)。クラスのロード チェックに合格すると、Java 仮想マシンは新しいオブジェクトにメモリを割り当て始めます。 Java ヒープ内のメモリが完全に規則的である場合、使用済みのメモリはすべて片側に配置され、空きメモリは反対側に配置され、分割ポイントのインジケーターとしてポインタが中央に配置されます。割り当てられたメモリは、オブジェクトのサイズに等しいインスタンスによって、ポインタを空き領域に向かって移動するだけです。この割り当て方法は「ポインタ衝突」と呼ばれます。 Java ヒープ内のメモリが規則的でなく、使用済みメモリと空きメモリが絡み合っていて、ポインタの衝突が起こらない場合、仮想マシンは使用可能なメモリを記録するリストを維持し、割り当て時にリストからオブジェクト インスタンスに割り当てる大きな領域を見つけて、リスト上のレコードを更新する必要があります。この割り当て方法は「フリーリスト」と呼ばれます。 オブジェクトの作成は仮想マシンでは非常に頻繁に行われる動作であり、線形安全性の問題が発生する可能性があります。あるスレッドがオブジェクト A にメモリを割り当てており、ポインタがまだ変更されていない場合、別のスレッドがオブジェクト B にメモリを割り当てており、まだ前のポインタを参照している場合は、「問題」が発生します。 メモリ割り当てアクションは、スレッドに応じて異なるスペースに分割できます。各スレッドには、Java ヒープ内の小さなメモリ領域、つまり「TLAB (スレッド ローカル割り当てバッファー)」が事前に割り当てられます。仮想マシンは -XX:UseTLAB を介してこれを設定します。 9. CMS ガベージ コレクターの動作プロセス、CMS コレクターと G1 コレクターの違い。 CMS (Concurrent Mark Sweep) コレクター: 最短の回復一時停止時間、マークスイープ アルゴリズム、および操作プロセス (「初期マーキング、同時マーキング、再マーキング、同時スイープ」) を取得することを目的としたコレクター。コレクションの最後に大量のスペースの断片化が生成されます。写真の通りです(下の写真はインターネットから引用したものです): 「CMSコレクターとG1コレクターの違い:」
10. JVMのチューニング JVM チューニングは、実際には JVM パラメータを調整すること、つまり、ガベージ コレクターとメモリ割り当てを調整して、より高いスループットとパフォーマンスを実現することです。 JVMチューニングは主に以下のパラメータを調整します 「スタックメモリ関連」
「ガベージコレクター関連」
「補助情報関連」
参考文献と謝辞
この記事はWeChatの公開アカウント「カタツムリを拾う少年」から転載したものです。下のQRコードからフォローできます。この記事を転載する場合は、カタツムリを採る少年の公式アカウントまでご連絡ください。 |
>>: Linux 仮想化 KVM-Qemu 割り込み仮想化の分析
edgenatは2周年を迎え、ブラックフライデーの時期でもあるため、特別なイベントを開催します。すべ...
最適化を行っている多くの友人が、Baidu のインデックス作成が遅くなった、または Baidu の評...
[[328776]]コンセプト仮想マシン: 完全なハードウェア システム機能をシミュレートし、完全に...
レレはYYで最初に歌った人の一人です記者 ブ・シャン 写真 王欣レレ氏はオフィスに戻り、中国工商銀行...
何百GBもの美しい写真が集まっているので、それをバックアップしてみんなと共有できる良い場所を見つけた...
[[259783]] Redis、Cassandra、Amazon S3、BitTorrent など...
月収10万元の起業の夢を実現するミニプログラム起業支援プラン誰もが気に入る、あるいは賞賛するような大...
私は数年前から Google のことを知っていますが、詳しくは知りません。しかし、SEO の観点から...
百度の外部リンクツールのリリースに伴い、百度統計もそれに追随し、昨夜7時30分頃にアップグレードしま...
SEO が 2 つのカテゴリに分かれていることは誰もが知っています。これら 2 つのカテゴリは異なる...
Baiduのアルゴリズムは実はあまり奥が深くなく、各アルゴリズムを担当するエンジニアも異なるため、そ...
2020年4月16日、中国のマルチクラウド管理プラットフォームソフトウェアおよびサービスプロバイダー...
ご存知のとおり、99% の仮想ホストは大量のトラフィックに耐えられません。多くのお客様が一定期間弊社...
1社は民間の宅配便大手、もう1社は物議を醸す電子商取引界の大物だ。外の世界では「不可分」とみなされて...
(文:季勇青、袁銀、編集者:王奇) Android アプリ ストアで「QQ」を検索すると、モバイル ...