導入 この記事の使い方: この記事は、検索ツリーのような、仮想マシンのほとんどの知識ポイントのフレームワークです。知識の一部を知りたい場合は、ルート ノードから検索を開始し、知りたい知識が配置されているリーフ ノードまたはサブツリーを見つけます。しかし、すべての知識を 1 つの記事に列挙すると、記事が長くなりすぎて全体の枠組みがわからなくなってしまいます。そのため、この記事では、ナレッジポイントをリンク形式で詳しく紹介します。この記事を通じて、JVM 関連の知識を思い出すことができます。思い出せない箇所があった場合は、該当するリンクをクリックして閲覧することができます。この試験のような学習方法は印象を深めることができ、テキストをじっと見つめて暗記するよりも記憶効果がはるかに高くなります。 コンテンツ
Javaのメモリ管理メカニズムについて話す C++ と比較すると、Java のメモリ管理メカニズムは大きな特徴です。プログラマーは、メモリを手動で解放するためのコードを書く必要がなくなりました。自分で実行したい場合でも、仮想マシンではこれを行う機会が与えられません (つまり、GC を自動的にトリガーする方法はありません)。仮想マシンは Java のメモリを完全に制御します。これは素晴らしいように思えますが、仮想マシンが不注意になると(結局のところ、仮想マシンはそのようなプログラムを記述できることを知らないので、仮想マシンを責めることはできないと思いますが...)、メモリリークが発生し、問題を見つけるのが難しくなるため、仮想マシンがどのようにメモリを管理しているかを知ることは非常に重要です。 仮想マシンのメモリ管理は、実際には、使用しなくなったオブジェクトを格納するメモリをクリーンアップし、クリアして、新しいオブジェクトを格納するために使用します。したがって、まず次の質問を検討する必要があります。
仮想マシンは、オブジェクトが配置されている場所を認識し、古いオブジェクトがどこにあるかを認識します。次に、Java の優れた機能の 1 つであるガベージ コレクション (GC) について説明します。ガベージ コレクションは、その名前が示すように、これらの古くなったオブジェクトをクリアして、新しいオブジェクトのためのスペースを確保することです。主に以下の点に留意します。
オブジェクトがどのようにリサイクルされるかを説明したので、Java のメモリ管理メカニズムに必要な細かい部分は完成しました。つまり、Java のメモリ管理プロセスは次のようになります。 新しいオブジェクトが何であるかに基づいて、それを置く場所を見つけます 新しいオブジェクト用のスペースがメモリ内にない場合は、スペースをクリアするために GC が実行されます。 本当に場所が見つからない場合は、OOM を投げてください... 仮想マシンは通常、世代別コレクション アルゴリズムである GC アルゴリズムの進化バージョンを使用します。つまり、仮想マシンの Java ヒープ内のメモリは、新しい世代と古い世代に分割されます。では、新しいオブジェクトを配置する場所を探す場合、どこに配置すればよいのでしょうか?具体的にはどのように配置すればよいのでしょうか?オブジェクトは配置後に別の場所に移動されますか? GC はいつ実行されますか?何をクリーンアップする必要がありますか? ... Java のメモリ管理メカニズムの詳細については、私の以前の記事をお読みください。 ここまでで、Java のメモリ管理メカニズムについての説明はほぼ終わりました。これで、仮想マシンの制御下でオブジェクトがメモリ内をどのように移動するかがわかりました。しかし、まず第一に、オブジェクトは作成したクラスに従って作成する必要があるので、作成したクラスはどのようにしてメモリ内のオブジェクトになるのでしょうか?さらに、メソッドを実行するためにオブジェクトを作成しますが、このメソッドはどのように実行されるのでしょうか?これらの質問に答えるには、Java 仮想マシンがプログラムを実行する方法を調べる必要があります。 Java仮想マシンプログラムの実行について話す Java プログラムを実行する場合は、まず Java コードをバイトコード ファイル、つまりクラス ファイルにコンパイルする必要があります。ここではコンパイル プロセスについては説明しません。主にこの Class ファイルの実行方法について説明します。そのため、まず Class ファイルの構成構造を理解する必要があります。 構成構造を理解した後、次に検討する必要があるのは、この .class ファイルをメモリにロードし、メソッド領域 (Java 8 以降は Metaspace になります) 内の Class オブジェクトに変換する方法です。 (クラスの読み込み)。 仮想マシンのクラスロードメカニズムについては、語るべきことがたくさんあります。誰もがそれについて尋ねるのが好きです。実際には、主に次の 3 つのプロセスが含まれます。
クラスをメモリにロードした後、次のステップでは、このクラス内のメソッドを実行する方法を検討します。 5 つの主要なメモリ領域にある Java 仮想マシン スタックは、サービスと Java メソッドのメモリ モデルであることがわかっているので、まず仮想マシン スタックのスタック フレームの構造を理解する必要があります。仮想マシン スタックのスタック フレーム構造には、次の部分が含まれます。
メソッドの実行を支援する Java 仮想マシン スタックの構造を理解した後、次のステップは Java クラスでメソッドを呼び出すことを検討することです。象を冷蔵庫に入れるのと同じように、メソッド呼び出しはすぐに実行されるのではなく、次の 2 つのステップに分割されます。
メソッド呼び出しステップを追加する必要があるのはなぜですか?すべてのメソッド呼び出しは、定数プール内のシンボリック参照としてクラス ファイルに保存されるため、必要なメソッドをすぐに実行することはできません。まず、このシンボリック参照 (実際には単なる文字列) に基づいて実行するメソッドを見つける必要があり、このプロセスはメソッド呼び出しと呼ばれます。このメソッドを見つけたら、スタックベースの解釈実行であるこのメソッドの実行を開始します。 メソッドを呼び出すには、まず仮想マシン内のどの命令がメソッド呼び出しを行うことができるか、つまりメソッド呼び出しバイトコード命令を調べてみましょう。 これらのバイトコードは、さまざまなメソッド呼び出しをトリガーします。一般的に言えば、次のようになります。
呼び出すメソッドを決定したら、スタックベースの解釈と実行を開始できます。この時点で、メソッドが実際に実行されます。 さらに、Java の動的型付け言語サポートを理解する必要があります。 仮想マシンのパフォーマンス監視とトラブルシューティングについて話す よく使用される JDK コマンドライン ツール: JDK コマンドライン ツール。 共通の JVM パラメータ設定が設定されました。一般的な JVM パラメータ設定を参照してください。 仮想マシンのチューニングに関するケース スタディについては、「仮想マシンのチューニングに関するケース スタディ」を参照してください。 JIT最適化について話す JIT (Just In Time)、つまりジャストインタイムコンパイルですが、まず JIT とは何かを知る必要があります。 次に、HotSpot 仮想マシンにおけるジャストインタイムコンパイラの動作プロセスについては、次の 5 つの質問を通じて調べることができます。
さらに、JIT は単にホット コードをマシン コードにコンパイルして終了するわけではありません。また、コードの実行も最適化されます。主に次のような古典的な最適化手法があります。
Java メモリ モデル (JMM) について説明します。 この部分は主に並行プログラミングに関連しているため、詳細な紹介は別のリポジトリである Java-Concurrency-in-Practice に移動します。 Java のメモリ モデルは、主に変数の値がメイン メモリ、スレッドの作業メモリ、および Java スレッド (実行エンジン) 間でどのように転送されるかを研究します。つまり、Java メモリ モデルではすべての変数がメイン メモリに格納されることが規定されていますが、各スレッドには独自の作業メモリがあり、その中にメイン メモリからコピーされた変数のコピーが格納されます。 Java スレッドが変数を変更する場合、まず自身の作業メモリ内で変更を行い、その後変更内容をメインメモリに同期します。 これは、コンピューターのストレージ デバイスとプロセッサの計算速度が数桁異なるため、メイン メモリと Java スレッドの間にバッファーとして作業メモリを追加する必要があるためです。ただし、これにより、メイン メモリと作業メモリ間のキャッシュ一貫性の問題も発生します。したがって、2 つの作業メモリ内の同じ変数の値が競合する場合、メイン メモリが変数を同期する順序、つまりどの作業メモリを参照するかを決定するために、特定のアクセス ルールが必要になります。 Java メモリ モデルの主な目的は、仮想マシンが変数をメモリに格納したり、メモリから取り出したりする方法に関するルールを定義することです。 簡単に言えば、Java メモリ モデルの 8 つのアトミック操作を習得し、これらの 8 つの操作を通じて Java メモリ間で変数がどのように転送されるかを知ることです。 実際、Java のメモリ モデルは、並行プロセスにおける原子性、可視性、順序という 3 つの特性をどのように処理するかを中心に構築されています。秩序性を保証するために volatile と synchronized に依存することに加えて、Java 自体にも Happens-Before 原則があります。この原則に基づいて、同時実行環境における 2 つの操作間に競合が発生する可能性があるかどうかを判断できます。 |
<<: クラウド コンピューティングの時代において、ハードウェアが依然として重要な理由は何でしょうか?
>>: AWSテクノロジーサミットが北京で開催され、クラウドコンピューティングの新たなトレンドが明らかに
原題:ヤオ・ジンボ:58.comはまだ初期段階にあり、気を緩める余裕はありません。来年中に監督者と管...
月給5,000~50,000のこれらのプロジェクトはあなたの将来ですコンテンツは王様、外部リンクは女...
今日、インターネットで質疑応答を見ました。内容は、SEOについて何も知らない上司に、SEOをうまく行...
朗報です。Vultr は、スタッフが過去数年にわたって製品の大規模なアップグレードに取り組んできたこ...
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスまず、基本的な理論を明確...
透過的な分散は、PolarDB-X がまもなくリリースする機能です。これにより、アプリケーションはス...
今日のインターネットは、合併や買収が絶えない時代、あるいは寡占の時代とも言えます。競争が激化する中で...
ロングテールキーワードは、他の最適化方法に比べて競争が少なく、ターゲットがより正確で、コンバージョン...
格安サーバーを専門に扱うreprisehostingは、現在から9月25日まで、米国西海岸のシアトル...
「こんにちは。投資したいお金があります。期待収益は 6 ~ 10 ポイントです。1 年間投資したいと...
12月26日、「第51回クレジットカード新霊獣夜・中国(杭州)イノベーション経済人表彰式」が盛大に開...
「ウェブサイトで活用すべき Google アナリティクスのヒント 11 選」という記事では、目標設定...
「離脱」を発表した翌日の6月13日20時18分、スマートイサンテクノロジーの創始者でDouyinのラ...
[[325305]]この記事では、Java 仮想マシン (JVM) の内部アーキテクチャについて説明...
joes-cloud は道徳的誠実さを放棄し、最初の 2 か月間の低価格プロモーションの割引コード ...