序文 コードを書くときは通常、コードとオブジェクト間のフローに重点を置きます。しかし実際のところ、Java プログラムの実行中にクラス、オブジェクト、ローカル変数、メソッド呼び出しチェーンがどこに保存されるかについて真剣に注意を払ったことがあるでしょうか?
JVM メモリ ご存知のとおり、Java プログラムは JVM 仮想マシンで実行されます。数多くの JVM 仮想マシンの中で、HotSpot VM は最も人気のある、または最も使用されている JVM バージョンです。 HotSpot VM では、仮想マシンのメモリ全体が複数のモジュールに分割されています。
ヒープ この領域には、通常、新しく作成されたオブジェクトが保存されます。この領域は、私たちが普段最も接触する領域でもあります。これは、私たちが通常注目する YGC と FGC である Young Generation と Old Generation に細分化されます。若い世代はさらに、エデン、サバイバーから、サバイバーへという 3 つの領域に分かれています。 YGC には、これら 3 つの領域を対象としたガベージ コレクション アルゴリズムを実行するためのさまざまなアルゴリズムがあります。ここではこれについては議論しません。興味があれば、面接官に問い合わせて、「JAVA GC ガベージ コレクション メカニズム」についてはこれ以上質問しないでください。 この領域はすべてのスレッドで共有され、主要なビジネス オブジェクトを格納するため、スペースは比較的大きくなります。通常、最小ヒープ サイズを設定するには -Xms を使用し、最大ヒープ サイズを設定するには -Xmx を使用します。 方法領域 メソッド領域には、スレッド共有、不連続メモリ、拡張可能、ガベージコレクション可能など、先ほど説明したスタック領域との多くの類似点があります。同様に、展開できなくなった場合は、OutOfMemoryError 例外がスローされます。メソッド領域は、非ヒープ領域とも呼ばれます。これをオフヒープメモリ領域から分離する必要があることに注意してください。 メソッド領域には、仮想マシンによってロードされたクラス情報、定数、静的変数、ジャストインタイムコンパイラによってコンパイルされたコードなどのデータが格納されます。これは、実行時に生成されるオブジェクトとは異なる、マテリアルの固定されたストレージ領域です。 メソッド領域のメモリリサイクル対象は、主に定数プールのリサイクルと型のアンロードです。一般的に言えば、この地域のリサイクルの「成果」は満足できるものになりにくく、特に種類の荷降ろしでは条件がかなり厳しいですが、リサイクルは確かに必要です。 プログラムカウンタレジスタ プログラム カウンターの機能は、現在のスレッドによって実行されたバイトコードの行番号のインジケーターと見なすことができます。バイトコード インタープリタが動作する場合、カウンターの値を変更して次のバイトコード命令を選択します。これらのうち、分岐、ループ、ジャンプ、例外処理、スレッド回復などの基本的な機能はすべて、完了するためにカウンターを使用する必要があります。 Java 仮想マシンのマルチスレッド化は、スレッドを順番に切り替えてプロセッサ実行時間を割り当てることによって実現されます。特定の瞬間に、プロセッサ (マルチコア プロセッサの場合はコア) は 1 つのスレッド内の命令のみを実行します。各スレッドの特定の処理ステップを保存する場所が必要であり、この領域がそれを行います。 JVM スタック アセンブリ言語を学んだことがある学生にとっては、その機能を理解しやすくなるかもしれません。スレッド呼び出しメソッドモデルを記録するスタックです。各スレッドには独自の仮想マシン スタックがあるため、対応するスレッドと生死も共有します。 各メソッド モデルはスタック フレームと呼ばれ、ローカル変数テーブル、操作スタック、動的リンク、メソッド戻りアドレスの 4 つの属性が格納されます。 ps: ローカル変数の場合、変数が基本型であればスタック フレームには対応する値が直接格納されますが、高度な型であれば値への参照のみが格納されます。 ネイティブメソッドスタック これは仮想マシン スタックと同様に機能し、StackOverflowError および OutOfMemoryError 例外もスローします。 違いは、仮想マシン スタックは仮想マシンに Java メソッド (バイトコード) の実行を提供するのに対し、ローカル メソッド スタックは仮想マシンが使用するネイティブ メソッドを提供するという点です。 JVM のメモリについては、比較と理解を助けるために次のような図でまとめることができます。 オフヒープメモリ JVM メモリとは異なり、Java でもオフヒープ メモリがよく使用されます。 JVM メモリには非常に完全なガベージ管理メカニズムがあり、開発者はメモリ リソースのリサイクルを気にすることなく自由に開発できますが、一連の非常に複雑で洗練されたガベージ管理アルゴリズムが存在するため、高同時実行性 (特にメモリ書き込みが多い場合) では YGC と FGC が頻繁に発生し (GC ごとにプログラムがフリーズします)、パフォーマンスのボトルネックの一因となります。 このようなビジネス状況では、通常、オフヒープ メモリを使用してパフォーマンス レベルを向上させます。オフヒープ メモリは、実際には JVM の管理外にある物理マシン メモリです。これは JVM によって管理されないため、当然ながら JVM の GC アルゴリズムはなく、より優れたスケーラビリティと IO 速度が得られます。 JAVA では、Unsafe および NIO パッケージの ByteBuffer を使用してオフヒープ メモリを操作するか、ohc (off-heap-cache) などのサードパーティのオフヒープ キャッシュ管理パッケージを使用して操作することができます。 |
>>: EduSoho ユーザー カンファレンスは「教育の未来」に焦点を当て、オンライン教育を強化する 4 つの新製品をリリースしました。
概念を理解することはどれほど重要ですか?羅振宇はかつてこう言いました。「概念を理解することが基本的な...
1. バフェット氏、フェイスブック株で一夜にして金持ちになるのは良くない考えだと語るテンセントテクノ...
今年の「ダブル11」電子商取引戦争の日に、オンライン商店主が大儲けしたことはよく知られている。ア...
新浪科技ニュース:北京時間4月27日早朝のニュースで、米国第2位の共同購入サイトLivingSoci...
テンセントの力には驚かざるを得ない。もともとあまり普及していなかったQRコードが、WeChatの普及...
クラウド コンピューティングがエンタープライズ IT の主流のテクノロジ トレンドとなった理由は、ユ...
[[439872]]メタバースの普及により、仮想空間への入り口であるVR(バーチャルリアリティ)が再...
pavhost.com は、2009 年に設立された小規模なホスティング プロバイダーです。紹介情報...
1. アリババのIPOは、新CEOが社内の力に対処するのに苦労しているため行き詰まっている可能性があ...
SEO に詳しい友人は皆、「コンテンツこそ王様」という言葉を知っていますが、「コンテンツこそ王様」が...
昨夜、多くのウェブマスターがため息をついたかもしれません。「夜は長くて眠れない」。百度は昨夜、もう一...
HTMLコードの最適化Google や MSN と比較すると、Yahoo! は HTML コードに重...
多くの学生は、ウェブサイト最適化の専門家は非常に神秘的だと考えています。私も最適化の知識を学び始めた...
最も基本的なルールに基づいて、検索エンジンはユーザーがコンテンツを発見できるようにするために存在しま...
私は5年間Doubanのベテランユーザーであり、Doubanブランドのオンラインプロモーションに2年...