この記事はWeChatの公開アカウント「三太子敖冰」から転載したもので、著者は三太子敖冰です。記事を転載する場合は、第三王子敖冰の公式アカウントまでご連絡ください。 このシリーズは私の新しいインタビューシリーズともいえるもので、先行公開するコンテンツでもあります。それらのほとんどは、チャーリーと私がインタビュー前に読んだもので、いくつかは私が読んだり作業したりした後に整理したメモです。 しかし、皆さんはこの直接的な質疑応答形式の方が好きか、それとも私が最初に始めた遊び心のあるインタビュースタイルの方が好きかはわかりません。 クロスプラットフォームとは何ですか? また、Java ではどのように実現されますか?プラットフォームは OS + ハードウェアを指す場合があります。いわゆるクロスプラットフォーム性とは、特定の言語で書かれたプログラムを複数のシステム プラットフォームで実行できることを意味します。 バイトコードは、Java 仮想マシンを通じてシステム プラットフォーム上で実行されます。システムが対応する Java 仮想マシンをインストールできる限り、システムは Java プログラムによってコンパイルされたバイトコード ファイルを実行できます。つまり、一度コンパイルすればどこでも実行できます。 JVM はクロスプラットフォームですか?いいえ、Java プラットフォームの中核は、バイトコードを実行する「仮想マシン」という概念です。このバイトコードは、プログラムが実行されるハードウェアやオペレーティング システムに関係なく同じです。 Java プログラムはプラットフォームに依存しますが、それを実行する Java 仮想マシン コードはプラットフォームに依存します。オペレーティング システムまたはハードウェアごとに異なる仮想マシンが存在します。 JVM はどのように機能しますか?ユーザーはaobing.javaファイルを作成します Java コンパイラ (javac) はファイルを aobing.class ファイルにコンパイルし、そこでコンパイル時の最適化が実行されます。 Java 仮想マシンはクラスをロードし、インタープリターまたはジャストインタイムコンパイラによって行ごとにマシンコードにコンパイルします。 変換されたマシンコードは CPU によって直接実行され、主流の仮想マシンはオペレーティング システム上に構築されます。 ジャストインタイムコンパイラとは何ですか?Just-In-Time コンパイラは JRE の一部であり、正式名称は Just-In-Time コンパイラ (一般に JIT と呼ばれます) です。実行時の Java アプリケーションのパフォーマンスを大幅に向上できます。 Java がバイトコードにコンパイルされると、そのコードは JVM を通じてさまざまなコンピューター アーキテクチャ上で実行できるようになります。実行が開始されると、まず JVM 内のインタープリタが動作を開始し、バイトコードを行ごとにネイティブ マシン コードに解釈します。つまり、Java アプリケーションの実行速度はネイティブ言語アプリケーションよりも遅くなります。これが背景です。 効率を向上させるために、仮想マシンは JIT テクノロジを導入し、ホット スポット コードをネイティブ コードにコンパイルすることで Java プログラムのパフォーマンスを向上させました。 JIT コンパイルされたコードはメソッド領域に保存されます。 仮想マシンはホットスポット コードをどのように識別しますか?現在、ホットスポット コードを検出する方法は 2 つあります。 サンプリング カウンタ HotSpot はカウンター アプローチを使用しており、各メソッドに対して 2 種類のカウンターを用意しています。 呼び出しカウンター バックエッジカウンター。 どちらのカウンターにも一定のしきい値があります。カウンターがしきい値を超えてオーバーフローすると、JIT コンパイルがトリガーされます。 JDK、JRE、JVMJDK: 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 への参照を提供しません。
クラスを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 で使用される方法です。 ガベージコレクションアルゴリズムについての簡単な説明
どのようなゴミ収集業者を知っていますか?
スタックとレジスタベースの命令セットアーキテクチャとは何ですか?前者の命令実行プロセスでは、スタック データ構造を使用する必要があります。主な利点は移植性であり、欠点は実行速度が遅いことです。 後者のレジスタ命令はハードウェアによって直接提供され、非常に高速ですが、ハードウェアに強く結びついているという欠点があります。 当社の主流の Java 仮想マシンはすべて、スタックベースの命令セット アーキテクチャを使用しています。 仮想マシンスタックとは何ですか?JVM 仕様では、各 Java スレッドが独自の独立した JVM スタック (Java メソッドの呼び出しスタック) を持つことが許可されています。 メソッドが呼び出されると、スタック フレームが作成されます。メソッドの呼び出しと戻りのプロセスは、実際にはスタック フレームのプッシュとポップです。 スタック フレームは仮想マシン スタックに格納されます。スタック フレームには、メソッドのローカル変数テーブル、オペランド スタック、動的接続、メソッドの戻りアドレスなどの情報が格納されます。 スレッドの実行プロセス中、アクティブな状態にあるスタック フレームは 1 つだけであり、これを「現在のアクティブ スタック フレーム」と呼びます。現在アクティブなスタック フレームは、常に仮想マシン スタックの最上位要素になります。 プログラム カウンターがプライベートなのはなぜですか?仮想マシンはマルチスレッド同時実行をサポートしており、プログラム カウンターは主にスレッド切り替え後に正しい実行位置に復元するために非公開になっています。 マルチスレッドの場合、プログラム カウンターは現在のスレッド実行の場所を記録するために使用されるため、スレッドが戻されたときに、スレッドが最後に実行された場所を知ることができます。 ネイティブによって変更されたネイティブ メソッドが実行されると、プログラム カウンターに未定義のアドレスが記録されることに注意してください。 Java コードが実行されたときのみ、プログラム カウンターは次の命令のアドレスを記録します。 SafePointとは何ですか?たとえば、GC を実行する場合、VMThread は、GC の実行を開始する前に、すべての Java スレッドがセーフポイントに入るまで待機する必要があります。 1. ループの終了 (他のスレッドがセーフポイントに入るのを待っている間に大きなループがセーフポイントに入らないことを防ぐため) 2. メソッドが戻る前 3. メソッドの呼び出し後 4. 例外がスローされる場所 Java オブジェクトを作成するプロセスは明確ですか?
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 で導入されました。
したがって、JDK 1.7 では、permanent 世代はメソッド area の実装であると言えます。もちろん、HotSpot JDK 1.8 では、メタスペースはメソッド領域の実装と見なすことができます。 permspace の代わりに metaspace を使用する必要があるのはなぜですか?主なポイントは次のとおりです。
終わり最近、体調があまりよくありません。つまり、いろんなことでイライラしちゃったんです、ハハハ。それから周りで結婚する人が増えたので、私もパートナーを見つけたいと思い、一日中いろんなことを考えています。 しかし、今日はよく考えて自分自身を叩きました。大企業に携わったことのない読者もまだまだたくさんいます。私はどんな愛を抱くことになるのでしょうか?今後は、毎週 1 つの技術記事、財務管理に関する記事 1 つ (週末に投稿)、毎週 3 つの地球に関するビデオ、そしてその週の自分の経験に基づいた水に関する記事を執筆します。それはどうですか? また、毎月Bilibiliで2本の動画を作成することを保証します。もうそんな些細なことで立ち止まることはできない。実は最近ゲームにはまっています。反省した後、私は LOL モバイル ゲームをアンインストールし、目標を達成するまでモバイル ゲームをプレイしません。 私は相変わらずのアオ・ビンです。知れば知るほど、知らないことも増える。また次回お会いしましょう。 |
<<: 一般的に使用される分散トランザクションとは何ですか?どれを使えばいいでしょうか?
>>: 継続的インテグレーションパイプラインにおけるアーティファクト管理 (Nexus)
アマゾンは、先進国の大半に商品を一夜にして届けることができる世界的な電子商取引帝国を築く過程で、分散...
パブリック クラウドの全体的なコストは企業にとって魅力的かもしれませんが、考慮すべき他の多くの要素が...
今年5月にAsiaInfo SecurityとLenovoが統合セキュリティソリューションに関する戦...
月収10万元の起業の夢を実現するミニプログラム起業支援プラン現在、WeChatのアクティブユーザーは...
「仮想化技術」は、IT技術に携わる人なら聞いたことがある、あるいは応用したことがあるはずですが、ほと...
2019年、サーバーレスはガートナーによってクラウドコンピューティング技術の最も有望な開発方向と評さ...
クラウド コンピューティングは現在、成熟したテクノロジーとアプリケーションです。米国国立標準技術研究...
今日お話しするASOマスターはヒマラヤです。 ASO の最高レベルは何ですか?答えは、APP ストア...
皆さんご存知のとおり、彼らの仮想ホストは常に「H-ball」パネルを使用してきました。良いニュースを...
みなさんこんにちは。私はMuzi Chengzhouです。 SEO を行う際、SEO をうまく行うに...
ソーシャルメディアを利用しない10代の若者の割合は、2017年の17%から2018年には19%に増加...
Hostsolutions は、誰もが知っているルーマニアの企業です。独自のコンピューター ルームと...
「ビジネス」という言葉は、産業用インターネットでは異なる意味を持つようです。説明しなくても、人々が自...
[51CTO.comからのオリジナル記事] 現在、COVID-19の流行により、中国のデジタル化は急...
私は毎日記事を更新するウェブサイトを持っており、ホームページのスナップショットも毎日更新しています。...