序文 コードを書くときは通常、コードとオブジェクト間のフローに重点を置きます。しかし実際のところ、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 つの新製品をリリースしました。
ssdvps は、価格性能比が非常に優れた VPS ベンダーです。Host Cat は、ssdvps...
hostcircle は現在、オランダのアムステルダム データ センターで、高負荷タスクの実行に最適...
23日の夕方、いつものように百度のウェブサイトの状況を確認したところ、百度に若干の変更が加えられてい...
最近、世界をリードするロボティック・プロセス・オートメーション(RPA)プラットフォームであるUiP...
iPhone 6は約束通り中国本土には入らなかったが、最近、iPhone 6に関する議論や進展が国内...
独立したウェブマスターとしての私のキャリアは、ウェブサイト グループから始まり、ウェブサイト グルー...
GoogleのPRが更新されるにつれて、人々は徐々にBaiduの重みに注目し始めています。友好的なリ...
11月2日、ByteDanceのインフラストラクチャチームは、NVMe-oF(NVMe over F...
アリババは8月20日夜、2021年度第1四半期決算を発表した。クラウド事業は力強く成長し、2020年...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますインターネ...
デスクトップ PC の絶対的な中核ビジネスとして、検索は常にインターネット企業やウェブマスターによる...
オープンソース ソリューションの世界的な大手プロバイダーである Red Hat は本日、Red Ha...
誤解について話しましょう。Google Reader で購読しているブログの記事を見ました。どの記事...
Sugarhosts も有名なホスティング会社です。まず最初に知っておきたいのは、同社の仮想ホストで...
SEO を少しの間学んだばかりの友人なら誰でも、コンテンツは王様、外部リンクは皇帝という格言を知って...