導入 この記事の使い方: この記事は、検索ツリーのような、仮想マシンのほとんどの知識ポイントのフレームワークです。知識の一部を知りたい場合は、ルート ノードから検索を開始し、知りたい知識が配置されているリーフ ノードまたはサブツリーを見つけます。しかし、すべての知識を 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テクノロジーサミットが北京で開催され、クラウドコンピューティングの新たなトレンドが明らかに
最近、友好的なリンクを交換するときに相手が必ず尋ねると言っているウェブマスターをよく見かけます。スナ...
これは、グループ購入が初めて登場した 2010 年に書かれた古い記事です。その年は百連隊作戦の年で、...
ヘルスケア業界がクラウド コンピューティングを使用してデジタル変革を加速し、大量のデータを処理し、コ...
2006 年に設立されたアイスランドのホスティング会社である 1984hosting は、主にドメイ...
[[409364]]インタビューゲスト |中国建設銀行金融技術部ゼネラルマネージャー兼同グループの金...
最近、Baidu が数回メジャーアップデートを行った後、約 2 か月間観察した結果、一緒に議論できる...
ページが閲覧される時間の長さは、ユーザーがそのページに滞在する時間の長さと同じではありません。したが...
企業は、クラウド コンピューティング環境の管理を改善し、データセンターの東西トラフィックをより適切に...
ウェブマスターが毎日どれだけ大変な仕事をしているかは、誰もがよく知っています。ウェブサイトのコンテン...
クラウド コンピューティング プロバイダーは、データを分析し、スキルの低いユーザー (または予算が限...
SEO技術は中国で10年近く普及しており、当時のSEOの運用方法は非常にシンプルで、意図的に行えばキ...
最近、「Crazy Webmasters」を再び読みました。私が最も興味を持ったのは、本のウェブサイ...
今日最も人気のある業界といえば、それはオンライン マーケティングでしょう。毎日上げ潮のように押し寄せ...
[51CTO.comよりオリジナル記事] 中国市場で唯一の国際パブリッククラウドを展開する21Via...
[[409670]]前回の記事では、Kafka プロダクション側のロジックと、メッセージがキャッシュ...