インタビューシリーズ再開:JVM編

インタビューシリーズ再開:JVM編

[[428155]]

この記事はWeChatの公開アカウント「三太子敖冰」から転載したもので、著者は三太子敖冰です。記事を転載する場合は、第三王子敖冰の公式アカウントまでご連絡ください。

このシリーズは私の新しいインタビューシリーズともいえるもので、先行公開するコンテンツでもあります。それらのほとんどは、チャーリーと私がインタビュー前に読んだもので、いくつかは私が読んだり作業したりした後に整理したメモです。

しかし、皆さんはこの直接的な質疑応答形式の方が好きか、それとも私が最初に始めた遊び心のあるインタビュースタイルの方が好きかはわかりません。

クロスプラットフォームとは何ですか? また、Java ではどのように実現されますか?

プラットフォームは OS + ハードウェアを指す場合があります。いわゆるクロスプラットフォーム性とは、特定の言語で書かれたプログラムを複数のシステム プラットフォームで実行できることを意味します。

バイトコードは、Java 仮想マシンを通じてシステム プラットフォーム上で実行されます。システムが対応する Java 仮想マシンをインストールできる限り、システムは Java プログラムによってコンパイルされたバイトコード ファイルを実行できます。つまり、一度コンパイルすればどこでも実行できます。

JVM はクロスプラットフォームですか?

いいえ、Java プラットフォームの中核は、バイトコードを実行する「仮想マシン」という概念です。このバイトコードは、プログラムが実行されるハードウェアやオペレーティング システムに関係なく同じです。 Java プログラムはプラットフォームに依存しますが、それを実行する Java 仮想マシン コードはプラットフォームに依存します。オペレーティング システムまたはハードウェアごとに異なる仮想マシンが存在します。

JVM はどのように機能しますか?

ユーザーはaobing.javaファイルを作成します

Java コンパイラ (javac) はファイルを aobing.class ファイルにコンパイルし、そこでコンパイル時の最適化が実行されます。

Java 仮想マシンはクラスをロードし、インタープリターまたはジャストインタイムコンパイラによって行ごとにマシンコードにコンパイルします。

変換されたマシンコードは CPU によって直接実行され、主流の仮想マシンはオペレーティング システム上に構築されます。

ジャストインタイムコンパイラとは何ですか?

Just-In-Time コンパイラは JR​​E の一部であり、正式名称は Just-In-Time コンパイラ (一般に JIT と呼ばれます) です。実行時の Java アプリケーションのパフォーマンスを大幅に向上できます。

Java がバイトコードにコンパイルされると、そのコードは JVM を通じてさまざまなコンピューター アーキテクチャ上で実行できるようになります。実行が開始されると、まず JVM 内のインタープリタが動作を開始し、バイトコードを行ごとにネイティブ マシン コードに解釈します。つまり、Java アプリケーションの実行速度はネイティブ言語アプリケーションよりも遅くなります。これが背景です。

効率を向上させるために、仮想マシンは JIT テクノロジを導入し、ホット スポット コードをネイティブ コードにコンパイルすることで Java プログラムのパフォーマンスを向上させました。

JIT コンパイルされたコードはメソッド領域に保存されます。

仮想マシンはホットスポット コードをどのように識別しますか?

現在、ホットスポット コードを検出する方法は 2 つあります。

サンプリング

カウンタ

HotSpot はカウンター アプローチを使用しており、各メソッドに対して 2 種類のカウンターを用意しています。

呼び出しカウンター

バックエッジカウンター。

どちらのカウンターにも一定のしきい値があります。カウンターがしきい値を超えてオーバーフローすると、JIT コンパイルがトリガーされます。

JDK、JRE、JVM

JDK: JDK は、Java アプリケーションの開発、デバッグ、監視用のツールを含む (SDK) ソフトウェア開発キットの拡張サブセットです。

JRE: JRE は Java Runtime Environment と呼ばれ、Java アプリケーションを開発するためのプログラミング ツール セットである JDK の一部です。 Java ランタイム環境は、Java アプリケーションを実行するための最小要件を提供し、Java 仮想マシン (JVM) コア クラスとコア クラス ライブラリで構成されます。

JVM: JVM はバイトコードを実行できる仮想マシンです。これは、Java プラットフォームのコード実行コンポーネントです。

ファントム参照とは何ですか?

ファントム参照は、仮想マシンで定義される「非強力」参照のレベルの 1 つです。

4 つの参照のレベルは、高から低の順に、強い参照、弱い参照、弱い参照、ファントム参照です。

オブジェクトに強い参照がある場合、ガベージ コレクターはそれを回収しません。

オブジェクトにソフト参照のみがある場合、十分なメモリ領域があればガベージ コレクターはそれを回収しません。メモリ領域が不足している場合は、これらのオブジェクトのメモリが再利用されます。

弱参照オブジェクトの有効期間は短くなります。ガベージ コレクター スレッドが管轄下のメモリ領域をスキャンすると、弱参照のみを持つオブジェクトが見つかると、現在のメモリ領域が十分かどうかに関係なく、そのメモリが再利用されます。

ファントム参照のオブジェクトは非常に脆弱であるため、ファントム参照を介して参照されたオブジェクトを取得することさえできません。その存在の唯一の目的は、それが指すオブジェクトがリサイクルされるときに、ファントム参照自体が参照キューに追加され、それが指すオブジェクトがリサイクルされたことが記録されることです。

Javaのメモリ構造、メモリモデル、オブジェクトモデルとは何か

メモリ構造はランタイム データ領域に関連しています。

メモリ モデルは、さまざまなハードウェアとオペレーティング システム間のメモリ アクセスの違いを隠すために使用され、Java プログラムがさまざまなプラットフォームで一貫した同時実行効果を実現できるようにします。仮想マシンの仕様の一つです。

オブジェクト モデルとは、メモリ内の Java オブジェクトの実際の格納 (表現) 形式を指します。

ランタイム データ領域の部分は何ですか?

インスタンス オブジェクトが格納されるヒープ。

仮想マシンによってロードされたクラス情報、定数、静的変数、およびジャストインタイム コンパイラによって生成されたコードを格納するために使用されるメソッド領域。

マルチスレッドをサポートするためのプログラム カウンター。

メソッドの実行をサポートするために使用される仮想マシン スタックとネイティブ メソッド スタック。

オブジェクト指向の利点

このモデルは現実世界のオブジェクトに似ているため、理解しやすくなります。オブジェクト指向プログラミングは、カプセル化、継承、ポリモーフィズムなどの特性を持っているため、保守、再利用、拡張が容易な低結合・高凝集のシステムを設計することが可能です。

ポリモーフィズムとは何ですか?

オブジェクト指向の 3 番目の主要な特徴の 1 つ。

同じ動作が複数の異なる形式やパターンを持つ能力を指します。

オブジェクト指向言語である Java では、物事の複数の形式を記述することもできます。 Student クラスが Person クラスを継承する場合、Student オブジェクトは Student と Person の両方になります。

最終的な、最終的に、最終決定する、違い

Final はクラス、変数、メソッドを変更できます。クラスを変更すると、クラスを継承できなくなります。メソッドを変更すると、メソッドをオーバーライドできなくなります。変数を変更すると、変数が定数になり、再割り当てできなくなります。

最後に、通常は try-catch コード ブロック内で動作します。例外を処理するときは、通常、実行する必要があるコードメソッドをfinallyコードブロックに配置します。

真ん中は、例外が発生したかどうかに関係なく、コードブロックが実行されることを意味します。通常、リソースを閉じるためのコードを保存するために使用されます。

finalize は、すべてのクラスの親クラスである Object クラスに属するメソッドです。このメソッドは通常、ガベージ コレクターによって呼び出されます。

使用。

JVMがクラスをロードするプロセスについて話しましょう

JVM でのクラスのロードは、クラス ローダー (ClassLoader) とそのサブクラスによって実装されます。 Java のクラス ローダーは、実行時にクラス ファイル内のクラスを検索してロードする役割を担う、重要な Java ランタイム システム コンポーネントです。

Java のクロスプラットフォームの性質により、コンパイルされた Java ソース プログラムは実行可能プログラムではなく、1 つ以上のクラス ファイルになります。 Java プログラムがクラスを使用する必要がある場合、JVM はクラスがロードされ、接続 (検証、準備、解析) され、初期化されていることを確認します。

クラスのロードとは、通常はバイト配列を作成して .class ファイルを読み取ることによって、クラスの .class ファイル内のデータをメモリに読み込み、ロードされたクラスに対応する Class オブジェクトを生成することを指します。読み込みが完了した後、クラス オブジェクトはまだ完了していないため、この時点ではクラスは使用できません。クラスがロードされると、接続フェーズに入ります。このフェーズには、検証、準備 (静的変数のメモリの割り当てとデフォルトの初期値の設定)、解決 (シンボリック参照を直接参照に置き換える) の 3 つのステップが含まれます。

最後に、JVM はクラスを初期化します。これには次の処理が含まれます。1) クラスに直接の親クラスがあり、クラスが初期化されていない場合は、まず親クラスが初期化されます。 2) クラス内に初期化ステートメントがある場合、これらの初期化ステートメントが順番に実行されます。

クラスローダーとその機能とは何ですか?

JDK 1.2 以降、クラスのロード プロセスでは親委任メカニズムが採用されています。 Java プラットフォームのセキュリティがより確実に保証されます。このメカニズムでは、JVM に付属する Bootstrap がルート ローダーであり、他のローダーには親クラス ローダーが 1 つだけあります。クラスのロードでは、まず親クラス ローダーにロードを要求し、親クラス ローダーがロードできない場合にのみ、子クラスによってロードされます。

JVM は Java プログラムに Bootstrap への参照を提供しません。

  • ルート ローダー (BootStrap) は通常、ネイティブ コードで実装され、JVM 基本コア クラス ライブラリ (rt.jar) をロードする役割を担います。
  • 拡張ローダー (ExtClassLoader) は、java.ext.dirs システム プロパティで指定されたディレクトリからクラス ライブラリをロードします。その親ローダーは Bootstrap です。
  • システム ローダー (AppClassLoader) はアプリケーション クラス ローダーとも呼ばれ、その親クラスは Extension です。最も広く使用されているクラスローダーです。これは、環境変数 classpath またはシステム プロパティ java.class.path で指定されたディレクトリからクラスを記録し、ユーザー定義ローダーのデフォルトの親ローダーになります。
  • ユーザー定義クラスローダー (java.lang.ClassLoader のサブクラス) の親クラスは AppClassLoader です。

クラスを2回ロードする

2 回読み込むことはできますが、2 回目に読み込むと 1 回目が上書きされます。

エラーと例外の違いは何ですか?

エラーは、回復が困難だが不可能ではない重大な問題を示します。たとえば、メモリオーバーフローなどです。プログラムがそのような状況に対処できると期待するのは不可能です。例外は設計または実装の問題を表します。つまり、プログラムが正常に実行された場合には決して発生しない状況を表します。

System.out.println()、System とは何ですか、out とは何ですか、println とは何ですか?

System は、java.lang パッケージにバンドルされている final クラスです。

out は、システム クラスの静的メンバーである印刷ストリーム クラスへの参照です。

println は、出力を印刷するために java.io パッケージにバンドルされている Print Stream クラスのメソッドです。

メソッド領域、永続領域、メタデータ領域の関係は何ですか?

メソッド領域は JVM 仕様で必須であり、永続領域は Hotspot 仮想マシンによるメソッド領域の特定の実装です。前者は仕様であり、後者は実装方法です。 JDK 1.8 で変更が加えられました。

GC とは何ですか? また、なぜ必要なのですか?

GC はガベージコレクションの略です。メモリ処理は、プログラマーが問題を抱えやすい部分です。メモリのリサイクルを忘れたり、誤っていたりすると、プログラムやシステムが不安定になったり、クラッシュしたりする可能性があります。

Java 仮想マシンが提供する GC 機能は、オブジェクトがスコープを超えているかどうかを自動的に監視し、メモリを自動的に再利用することができます。 Java 言語では、割り当てられたメモリを解放するための明示的な操作メソッドは提供されていません。ガベージ コレクターがメモリ管理を自動的に管理するため、Java プログラマーはメモリ管理について心配する必要がありません。

GC の STW とは何ですか?

Java の Stop-The-World メカニズムは STW と呼ばれます。ガベージ コレクション アルゴリズムが実行されると、Java アプリケーションの他のすべてのスレッド (ガベージ コレクションを除く) が中断されます。

Java のグローバル一時停止現象。グローバル一時停止では、すべての Java コードが停止し、ネイティブ コードは実行できますが、JVM と対話することはできません。

ジャンク品を見分けるには?

一般的な方法は 2 つあります。

参照カウント方式では、オブジェクト間の循環参照の問題を解決するのが困難です。

到達可能性分析アルゴリズム。これは主流の JVM で使用される方法です。

ガベージコレクションアルゴリズムについての簡単な説明

  • マークアンドスイープアルゴリズムは、その名前が示すように、「マーキング」と「スイープ」の 2 つの段階に分かれています。まず、リサイクルが必要なすべてのオブジェクトにマークを付け、マーク付けが完了したら、マークされたすべてのオブジェクトをリサイクルします。
  • 使用可能なメモリを容量に応じて 2 つの同じサイズのブロックに分割し、一度にそのうちの 1 つだけを使用するレプリケーション アルゴリズム。このメモリ ブロックが使い果たされると、残っているオブジェクトが別のブロックにコピーされ、使用済みのメモリ領域がすぐにクリーンアップされます。欠点はスペースの無駄遣いですが、利点はリサイクルが速く、断片化がないことです。
  • マーク圧縮アルゴリズムでは、マーキング プロセスは「マークスイープ」アルゴリズムと同じですが、後続の手順ではリサイクル可能なオブジェクトを直接クリーンアップするのではなく、残っているすべてのオブジェクトを一方の端に移動してデフラグを完了します。
  • 世代別コレクション アルゴリズムは、Java ヒープを新しい世代と古い世代に分割し、各世代の特性に応じて最も適切なコレクション アルゴリズムを使用できるようにします。それはアルゴリズムというよりもアイデアに近いと思います。

どのようなゴミ収集業者を知っていますか?

  • シリアル コレクター: シリアル コレクターは、最も古く、最も安定しており、効率的なコレクターです。一時停止が長くなる可能性があり、リサイクルには 1 つのスレッドのみが使用されます。
  • ParNew コレクター、ParNew コレクターは、実際には Serial コレクターのマルチスレッド バージョンです。
  • Parallel Collector、Parallel Scavenge Collector は ParNew Collector に似ています。 Parallel Collector はシステム スループットに重点を置きます。
  • Parallel Oldコレクター、Parallel Oldは、マルチスレッドと「マークスイープ」アルゴリズムを使用するParallel Scavengeコレクターの旧世代バージョンです。
  • CMS コレクター、CMS (Concurrent Mark Sweep) コレクターは、最短のリカバリ一時停止時間を取得することを目的としたコレクターです。
  • G1 コレクター、G1 (Garbage-First) は、主に複数のプロセッサと大容量メモリを搭載したマシン向けのサーバー指向のガベージ コレクターです。 GC 一時停止時間要件を高い確率で満たしながら、高いスループット パフォーマンス特性を備えています。

スタックとレジスタベースの命令セットアーキテクチャとは何ですか?

前者の命令実行プロセスでは、スタック データ構造を使用する必要があります。主な利点は移植性であり、欠点は実行速度が遅いことです。

後者のレジスタ命令はハードウェアによって直接提供され、非常に高速ですが、ハードウェアに強く結びついているという欠点があります。

当社の主流の Java 仮想マシンはすべて、スタックベースの命令セット アーキテクチャを使用しています。

仮想マシンスタックとは何ですか?

JVM 仕様では、各 Java スレッドが独自の独立した JVM スタック (Java メソッドの呼び出しスタック) を持つことが許可されています。

メソッドが呼び出されると、スタック フレームが作成されます。メソッドの呼び出しと戻りのプロセスは、実際にはスタック フレームのプッシュとポップです。

スタック フレームは仮想マシン スタックに格納されます。スタック フレームには、メソッドのローカル変数テーブル、オペランド スタック、動的接続、メソッドの戻りアドレスなどの情報が格納されます。

スレッドの実行プロセス中、アクティブな状態にあるスタック フレームは 1 つだけであり、これを「現在のアクティブ スタック フレーム」と呼びます。現在アクティブなスタック フレームは、常に仮想マシン スタックの最上位要素になります。

プログラム カウンターがプライベートなのはなぜですか?

仮想マシンはマルチスレッド同時実行をサポートしており、プログラム カウンターは主にスレッド切り替え後に正しい実行位置に復元するために非公開になっています。

マルチスレッドの場合、プログラム カウンターは現在のスレッド実行の場所を記録するために使用されるため、スレッドが戻されたときに、スレッドが最後に実行された場所を知ることができます。

ネイティブによって変更されたネイティブ メソッドが実行されると、プログラム カウンターに未定義のアドレスが記録されることに注意してください。 Java コードが実行されたときのみ、プログラム カウンターは次の命令のアドレスを記録します。

SafePointとは何ですか?

たとえば、GC を実行する場合、VMThread は、GC の実行を開始する前に、すべての Java スレッドがセーフポイントに入るまで待機する必要があります。 1. ループの終了 (他のスレッドがセーフポイントに入るのを待っている間に大きなループがセーフポイントに入らないことを防ぐため) 2. メソッドが戻る前 3. メソッドの呼び出し後 4. 例外がスローされる場所

Java オブジェクトを作成するプロセスは明確ですか?

  • JVM は、新しいオブジェクトを作成する命令に遭遇すると、まず、命令のパラメータを定数プール内のクラスへのシンボリック参照として定義できるかどうかを確認します。次にこのクラスをロードします(クラスのロードプロセスについては後で説明します)
  • オブジェクトにメモリを割り当てます。 1つの方法は「ポインタ衝突」、もう1つの方法は「フリーリスト」、そして最後によく使われる方法は「ローカルスレッドバッファ割り当て(TLAB)」です。
  • オブジェクトヘッダーを除くオブジェクトメモリ空間を0に初期化します。
  • オブジェクトヘッダーに必要な設定を行う

Java オブジェクト構造について学びましたか?

Java オブジェクトは、オブジェクト ヘッダー、インスタンス データ、および配置パディングの 3 つの部分で構成されます。

オブジェクト ヘッダーは 2 つの部分で構成されます。最初の部分には、オブジェクト自体のランタイム データ (ハッシュ コード、GC 生成期間、ロック識別ステータス、スレッドによって保持されているロック、バイアスされたスレッド ID (通常は 32/64 ビット)) が格納されます。 2 番目の部分はポインター型で、オブジェクトのクラス メタデータ型 (つまり、オブジェクトが表すクラス) を指します。配列オブジェクトの場合は、オブジェクトヘッダーに配列の長さを記録する部分もあります。

インスタンスデータは、オブジェクトの実際の有効な情報(親クラスから継承されたものや自身で定義されたものを含む)を格納するために使用されます。

アライメントパディング: JVM では、オブジェクトの開始アドレスが 8 バイトの整数倍である必要があります (8 バイトアライメント)

Java オブジェクトがどのように配置されるかご存知ですか?

ハンドル プール、直接ポインター。

メソッド領域と永続世代の違いは何ですか?

永続的な世代 (Perm 領域とも呼ばれる) は、HotSpot JVM にのみ存在し、JDK 1.7 以前のバージョンにのみ存在します。 JDK 1.8 では、permanent 世代は完全に削除され、メタスペースと呼ばれる新しいメモリ領域が JDK 1.8 で導入されました。

  • すべての JVM に永続的な世代があるわけではありません。 IBM の 9 と Oracle の JRocket には永続的な世代がありません。
  • 永続的な世代は実装レベルのものです。
  • 永続世代に保存されるものは、基本的にメソッド領域で指定されたものになります。

したがって、JDK 1.7 では、permanent 世代はメソッド area の実装であると言えます。もちろん、HotSpot JDK 1.8 では、メタスペースはメソッド領域の実装と見なすことができます。

permspace の代わりに metaspace を使用する必要があるのはなぜですか?

主なポイントは次のとおりです。

  • 文字列は永続的な世代に保存されるため、パフォーマンスの問題やメモリ オーバーフローが発生しやすくなります。
  • クラスやメソッドの情報に基づいて永続世代のサイズを決定することは困難です。したがって、永続世代のサイズを指定することは困難です。小さすぎると永久世代のオーバーフローが発生しやすくなり、大きすぎると古い世代のオーバーフローが発生しやすくなります。
  • 永続的な生成は GC に不必要な複雑さをもたらし、回復効率は低くなります。
  • 永続世代を削除するのは、HotSpot JVM と JRockit VM を統合するための取り組みです。 JRockit には永続的な世代がないため、永続的な世代を構成する必要はありません。

終わり

最近、体調があまりよくありません。つまり、いろんなことでイライラしちゃったんです、ハハハ。それから周りで結婚する人が増えたので、私もパートナーを見つけたいと思い、一日中いろんなことを考えています。

しかし、今日はよく考えて自分自身を叩きました。大企業に携わったことのない読者もまだまだたくさんいます。私はどんな愛を抱くことになるのでしょうか?今後は、毎週 1 つの技術記事、財務管理に関する記事 1 つ (週末に投稿)、毎週 3 つの地球に関するビデオ、そしてその週の自分の経験に基づいた水に関する記事を執筆します。それはどうですか?

また、毎月Bilibiliで2本の動画を作成することを保証します。もうそんな些細なことで立ち止まることはできない。実は最近ゲームにはまっています。反省した後、私は LOL モバイル ゲームをアンインストールし、目標を達成するまでモバイル ゲームをプレイしません。

私は相変わらずのアオ・ビンです。知れば知るほど、知らないことも増える。また次回お会いしましょう。

<<:  一般的に使用される分散トランザクションとは何ですか?どれを使えばいいでしょうか?

>>:  継続的インテグレーションパイプラインにおけるアーティファクト管理 (Nexus)

推薦する

クラウドコンピューティングの未来をどう定義するか

アマゾンは、先進国の大半に商品を一夜にして届けることができる世界的な電子商取引帝国を築く過程で、分散...

クラウド コンピューティングには隠れたコストがたくさんありますか?これらを知っておくと、安心してクラウドに移行できるようになります

パブリック クラウドの全体的なコストは企業にとって魅力的かもしれませんが、考慮すべき他の多くの要素が...

AsiaInfo SecurityとLenovoが協力し、5Gエッジコンピューティングのセキュリティネットワークエコシステムを模索

今年5月にAsiaInfo SecurityとLenovoが統合セキュリティソリューションに関する戦...

コレクションにおすすめ!ミニプログラムを宣伝する最も実用的な 7 つの方法!

月収10万元の起業の夢を実現するミニプログラム起業支援プラン現在、WeChatのアクティブユーザーは...

「IT百科事典」上級学習:「仮想化技術ガイド」

「仮想化技術」は、IT技術に携わる人なら聞いたことがある、あるいは応用したことがあるはずですが、ほと...

Amazon Web Services: 顧客がクラウドネイティブアプリケーションの構築を加速できるようにする 9 つのステップ

2019年、サーバーレスはガートナーによってクラウドコンピューティング技術の最も有望な開発方向と評さ...

クラウドコンピューティングとブロックチェーンが融合できる理由

クラウド コンピューティングは現在、成熟したテクノロジーとアプリケーションです。米国国立標準技術研究...

Himalaya は ASO をどのように活用してチャート上位を獲得しているのでしょうか?

今日お話しするASOマスターはヒマラヤです。 ASO の最高レベルは何ですか?答えは、APP ストア...

ixwebhosting 仮想ホスト プロモーション (Windows/Linux オプション)

皆さんご存知のとおり、彼らの仮想ホストは常に「H-ball」パネルを使用してきました。良いニュースを...

Baidu の発表に疑問:Baidu が公開したアルゴリズムはどの程度真実なのか?

みなさんこんにちは。私はMuzi Chengzhouです。 SEO を行う際、SEO をうまく行うに...

2019年ソーシャルマーケティングプロモーションレポート!

ソーシャルメディアを利用しない10代の若者の割合は、2017年の17%から2018年には19%に増加...

2019年下半期の産業インターネットの8大トレンド!

「ビジネス」という言葉は、産業用インターネットでは異なる意味を持つようです。説明しなくても、人々が自...

第1回デジタル中国クラウドデータ開発コンテストが終了し、デジタルイノベーションの新たなモデルが開かれた。

[51CTO.comからのオリジナル記事] 現在、COVID-19の流行により、中国のデジタル化は急...

毎日ウェブサイトが登録されているのに、登録総数が増えない理由

私は毎日記事を更新するウェブサイトを持っており、ホームページのスナップショットも毎日更新しています。...