JavaプログラマインタビューBATメーカー、JVM、JVM最新20インタビューの質問を免れることはできません

多くの人々は、JVMが学ぶことは本当にないと言いますか?JVMのインタビュアーが質問をするのだろうか?それが重要なのですか?

これは非常に重要です。

インターネット、ハイ同時高可用性の発展に伴い、高速な応答が必要なソフトウェアになり、JVMは密接にこれらに関連付けられています。

私たちは、原則の下を理解するために「これらの技術的特徴を達成するためにどのようにされて、」あなたも知っていると考えることを得る必要があり、同時に、Java仮想マシンのメリットを享受します。JVMでのみお馴染みの、あなたはのOutOfMemory及びその他の異常の顔には、最終的に問題を解決するためにいくつかのパラメータを変更するために始めた、それはまだ霧の場合でも、解決策を見つけるためにインターネットを強制的に無知見ていない、行かないであろうことができます。

実際には、「なぜJava仮想マシンを学ぶためにわざわざ、」この質問、および「なぜデータ構造とアルゴリズムを学ぶには、」真実です:私たちは、最初にその利益の必要があります。これは、Java仮想マシンが武器すべてのエンジニアJavaの詳細レイズで、あなたは常に簡単な発展に滞在したい、またはあなたの仕事をチューニング、Javaのパフォーマンス分析を行っているではない、あなたが技術を掘り下げたい、上昇したい、と言うことができます、Java仮想マシンは間違いなく、ブーストの剣です。

1.メモリモデルやパーティション、あなたは、各エリアに配置するかを詳細にする必要があります。

JVMスタック領域とヒープ領域を分割し、メソッド領域は、ヒープ上でインスタンス化されたオブジェクトどの領域にスタック、クラス情報クラスの定数プール(スタティック変数および定数静的)メソッドで参照等

新着:

メソッド領域:メインストレージクラス情報、定数プール(静的及び静的変数定数)、コンパイルされたコード(バイトコード)のようなデータ

ヒープ:初期化されたオブジェクトのメンバ変数(非静的変数の一種)、すべてのオブジェクトのインスタンスと配列がヒープ上に割り当てられます

スタックは:スタック構造をエクスポートするためのプレスフレームローカル変数テーブル格納され、その上、オペランドスタック、および他の情報とのメソッドを呼び出し、スタックフレームから構成され、それは大きなベースタイプのアプリケーションと一緒にローカル変数テーブル8に格納されます。タイプは、それがアドレスへのポインタであります

ネイティブメソッドスタック:ネイティブ・サービスのための主な方法

プログラムカウンタ:レコードの実行スレッドの現在の行番号

パーティション内の2ヒープ:エデン、(+からの)生存、昔、自分の特性。

旧世代と新世代(java8は、メタスペースを使用して永続的な世代をキャンセル)、エデン+サバイバー、メモリの回復からとするときに領域に分割されて遺族を備えた新世代領域に分割して、スタック、コピーアルゴリズムであれば、のへのからのコピー、JVMのメモリが足りないときにGC後に1回以上は、生き残ったオブジェクトが、殿堂入りに移動されたときに、高齢者の地域JVMをクリーンアップする、完全なGCをトリガします

面積は最初の1つのSurvice領域にオブジェクトを存続、新生児トリガーYGCのいっぱいになると、その後、ゴミをクリーンアップします。のみ削除するオブジェクトをクリーンアップする場合は、これはメモリの断片化につながるので、それはエデンのメモリを思い付く、その後、完全にきれいになり、一般的です。GC、次の時間、それはとてもリサイクル、次生き残る使用されます。特に大規模なオブジェクトがある場合は、新しい世代は、それが直接の古い内部に、古い時代の使用を保証する、適合しません。JVMは思うので、生存期間は、一般的には、一般的に、より遠くの大きな課題です。

3.オブジェクトの作成方法、メモリ割り当てのオブジェクトは、オブジェクトの位置をアクセスします。

新しいオブジェクト

二種類4.GC決意方法:

参照カウント:オブジェクトであれば場所は、それが失敗した場合は-1、+1を参照するが、JVMは0この方法で回収されていない場合、各円形の基準(基準Bために決定できないことを意味、Bはケースの)参照しました

チェーン基準法:GCルートオブジェクト(オブジェクト領域または変数の参照-static静的変数のような)を説明するためにGCルートに到達するためのリンクがあるかどうかを決定するための手段によって、それはGC ROOTを回収することができる説明到達できません

5.SafePointは何ですか

例えば、GCはVMThreadは、GCを開始する際にセーフポイントにJavaスレッドまで待たなければならないとき、

サイクルの終わり(それはセーフポイントを入力するために他のスレッドが待っている間、サイクルタイムを防ぐためには、セーフポイントを入力していません)

メソッドが戻る前に

呼び出し後メソッドを呼び出すには

異常な位置を投げ

6.GC 3つの収集方法:あなたはどのようなアイデア収集方法を最適化させた場合、マークをクリア、仕上げマーク、コピー、原則とアルゴリズムの特性は、任意の場所で使用されていましたか?

マーキングが完了した後の最初のマークは、その後、クリア、効率が高くない、それが破片を生成します

複製アルゴリズム:8に分割:エデン1区及び地区生存者は、YGC上述されます

整理するタグ:ラベルが完了すると、すべての生存オブジェクトは、一方の端部に向かって移動

7.GCコレクターは何?CMSコレクタとG1コレクタを備えています。

コレクタパラレルシリアルコレクタが収集する別のスレッドを使用して、GC休止時間と、サービス

シリアル・コレクタ:実行するために複数のスレッドを使用してセカンダリ回復

いくつかのマークがクリアされた後、達成するためのアルゴリズム - CMSのコレクタは、「スイープマーク」に基づいています

G1は、全体に基づいて、「マーク - ソート」アルゴリズムの「コピー」に基づいてビュー(領域との間の)ローカルから、コレクタのアルゴリズムを

8.Minor GCとフルGC、それぞれ、ときに起こるのですか?

MGCはまたYGC呼ば発生したときのメモリの新世代が十分でない場合には、JVMが十分でないメモリは、FGCを発生します

9.いくつかの一般的に使用されるメモリデバッグツール:jmapは、jstack、jconsoleを、jhat

jstackは、現在のスタック、jmapは表示メモリ、jhat情報ダンプヒープを見ることができます

マット(日食も見つける必要があります)

10.いくつかのクラスをロードするプロセス

ロード、検証、準備、解像度、初期化。次に、使用してアンロード

メモリにオブジェクトの完全修飾クラス名によって生成されたロードし、テキストを含め、このクラスファイルを、確認するには

メンバーフォーマット、メタデータ検証バイトコード検証などを確認します。このオブジェクトにメモリを割り当てる準備ができています。解像度は、シンボルであります

直接的な参照が参照(ポインタ参照)に変換されていない、初期化コードの実行を開始するコンストラクタであります

いくつかのゾーンに分割11.JVMメモリは、各ゾーンがどのような役割ですか?

Java仮想マシンは、主にゾーンに分かれています。

メソッドのエリア:

1.時々は、この地域に恒久的な世代のガベージコレクションとなっまれですが、それはGCはここで発生していないことを意味するものではありません

GCは、主に、定数プールの方法及び種類のアンローディング領域で行われます

2.メソッド領域は、主に情報、定数、静的変数およびリアルタイムのコンパイラクラスのストレージのために使用されている仮想マシンをロードされています

コードデータ等。

前記領域は、スレッドで共有されています。

この方法は、基準シンボルを生成するために、リテラルおよび静的コンパイラを記憶するためのゾーンの実行時定数プールを有しています。定数プール

コンパイル時に決定され、必ずしも一定ではなく、動的には、一定のこの定数の存在になります生成されたランタイム

プール。

仮想マシンのスタック:

1.仮想マシン・スタックは、我々は通常、スタックメモリを呼んで、それはJavaサービス・メソッドは、実行時の各方法であり、

これは、情報のローカル変数テーブル、オペランドスタック、およびダイナミック・リンク・エクスポートする方法を格納するためのスタックフレームを作成します。

2.仮想マシンのスレッドスタックは、そのライフサイクルと同じスレッドプライベートです。

3.基本データ型に格納されたローカル変数テーブル、RETURNADDRESSタイプ(バイトコード命令に対するポインタ

サイト)とオブジェクト参照、このオブジェクト参照がオブジェクトの開始アドレスへのポインタが存在してもよい、の代表が存在してもよいです

オブジェクトハンドルは、オブジェクトまたは位置に関連付けられています。メモリ空間に必要なローカル変数は、コンパイラの間で決定しました

オペランドスタックの4主な機能は、ストアオペランドとケーブルによってローカル変数テーブルとは異なる演算の結果に使用されます

訪問につながったが、プッシュとポップな方法

5.各スタックフレームはスタックフレームに関連する方法の実行時定数プールへの参照を含む、それへの参照を保持することです

ダイナミック接続支援方法は、動的リンクのプロセスは直接に、実行時にシンボリック定数プールの参照で呼び出します

参考文献。

ネイティブメソッドスタック

ネイティブメソッドスタックおよびスタックの仮想マシンは、ネイティブメソッドスタックのネイティブメソッドのサービスを除き、同様です。

ヒープ

Javaのヒープは、ほぼすべてのオブジェクトインスタンスは、仮想マシンの起動時に作成されているメモリのすべてのスレッドで共有されています

作成には、その領域は、ガベージコレクションが発生することが多いです。

プログラムカウンタ

必要性はバイトコードインタプリタの作業を実行する際に、バイトコードのカウント値を変更することにより、小さなメモリ空間は、選択することができ、

命令、分岐、ループ、分岐、例外処理、およびリカバリ機能のスレッドがこのカウンターの完了に依存する必要があります。インナー

預金エリアは、任意の領域のOOMの状況を指定していないだけで、Java仮想マシン仕様です。

12ターゲットの生存?(GCの決意法またはオブジェクト)か否かを判定する

オブジェクトの2つの方法で、生きているかどうかを確認します。

1.参照カウント

参照カウントは、いつでもどこオブジェクトへの参照、各オブジェクトのカウンタへの参照を設定するために呼び出され

、カウンタは失敗に言及する場合、カウンタはデクリメントされ、インクリメントされます。オブジェクトの参照カウントがゼロのとき、言いました

明このオブジェクトが参照されていない、または「死んだのオブジェクトは」ガベージコレクションとなります。

参照カウント法は、欠陥循環参照問題は、いつオブジェクトA参照オブジェクトB、オブジェクト、つまり、解決することができないました

Bとリファラの目的は、時間A、Bオブジェクト参照カウンタがゼロAではない、それは、完全なガベージバック原因できません

収入は、その主流の仮想マシンは、このアルゴリズムで使用されていません。

前記到達可能性アルゴリズム(参照チェーン方式)

アルゴリズムの考え方は次のとおりです。あれば最初からGCのルーツと呼ばれているオブジェクトは、ダウン検索GCへのオブジェクト

いかなる参照チェーンが接続されていない場合、根、このオブジェクトは使用できません。

GCのルーツはJavaでオブジェクトとして使用することができ、以下のとおりです。

VMのスタック参照オブジェクト

Areaクラスメソッドの静的プロパティは、オブジェクトを参照しました

定数プールエリア参照オブジェクトのメソッド

JNIネイティブメソッドスタックのオブジェクトが参照さ

これらのアルゴリズムは、オブジェクトを回収することができるが、上記の条件が満たされたときに、異なる被写体かどうかを判定することができるが

それは確かにリサイクルされます。オブジェクトが到達不能GCルート、およびこのオブジェクトである場合には

それはすぐに回復することはありませんが、本格的な回復すべき段階に執行猶予は、2つのマークを受ける必要があります

オブジェクトがGCルートストランド到達可能性解析で参照されていない場合は、時間が最初のマークとのためになります

最初のスクリーニングでは、スクリーニング条件は、ファイナライズ()メソッドを実行する必要があるかどうかです。オブジェクトがファイナライズを覆われていない()メソッド

それとも、その後、それが必要ではない、仮想マシンと呼ばれてきました。

オブジェクトがファイナライズ()メソッドを実行する必要がある場合、オブジェクトは、F-キューのチームに呼び出されます

コラム、仮想トリガーを実行するためにファイナライズ()スレッドに、このスレッドは低い優先度であり、仮想マシンは負いません

雪は、それが完了するまで実行するのを待っている、それは、ファイナライズ()やデッドロックの遅い実装が発生した場合、それはF-になりますようです

キューキューは、メモリ回収システムの崩壊をもたらし、待っています。GCのオブジェクトは、F-キューで実行されます

第二がマークされ、この時点では、オブジェクトがコレクション、回復待ちを「回復する」削除されます。

Javaのガベージコレクションの13の説明?

Javaでは、プログラマは、表示されたオブジェクトのメモリを解放するために必要とされていませんが、仮想マシン自体で実行されます。

JVMは、ガベージコレクタスレッドが通常の状況は、専用仮想実装されないの下、それは、低い優先順位であり、あります

提案されたユニットは、アイドル状態であるか、または現在のヒープメモリは、任意のオブジェクト参照で使用されていない実行、掃引表面を誘発するには不十分である、および

コレクション、回復に追加され回収されます。

ガベージコレクション14.java何の方法?

1.マーク - クリア:

これは、あなたが知っている名前によると、最も基本的なガベージコレクションアルゴリズムである、マークが何であるかであると考えています

オブジェクトを回収し、その後、均一なリサイクル。この方法は簡単ですが、2つの大きな問題があります。1.効率

プログラムの後半に至る、2は離散メモリ断片化の多数を生成する、高マークとスイープ効率が非常に低いです

十分な連続したメモリがないため、大きなオブジェクトの割り当ては、早期GCオペレーションをトリガします。

2.アルゴリズムをコピーします。

アドレス効率の問題するために、コピー・アルゴリズムによって使用可能なメモリ容量は、2つの等しい部分、及び時間に分割されています

1は、1つのメモリが不足すると、それはまた、その後、第2のメモリブロックに生きているオブジェクトをコピーします使用特徴

明確なワンタイムメモリの終了した後、最初のブロックに2つ目のブロックの上にオブジェクトをコピーします。しかし、この方法は、

コストは、それぞれが基本的に一般的なメモリを無駄にする必要があり、高すぎるメモリです。

分割の1が、メモリに分割されている:このようなアルゴリズムは、メモリ領域は、もはや1である、改善されていません

8:1:1の三つの部分、エデン領域をインターリーブメモリの大きなシェアは、残りの部分は2つの小さなメモリ領域がSurvior領域と呼ばれています。

エデンが優先エデン領域が満杯である場合、オブジェクトは、その後、第二のブロックのメモリ領域にコピーされ、すべての時間帯を使用しました

あまりにもオブジェクトを存続場合には、十分な生存者でないときエデンエリアをクリアした後、この時点では、これらがオンになります

保証メカニズムを割り当てることによって、古い時代にコピーのように。(Javaヒープは古いものと新しい世代の分割され)

3.マーク - 仕上げ

マークを解決するためのアルゴリズム - スイープ、メモリ断片化の問題の大量;標的の高い生存率

場合は、だけでなく、効率的な複製アルゴリズムの問​​題を解決します。オブジェクトは今戻ってくると、その違いは明らかです

メモリの断片化が発生しないように、移動するオブジェクトの終了を受け、その後、終了境界以外のオブジェクトをクリアします。

4.世代のコレクション

今、彼らはこのように仮想マシンのガベージコレクションを使用し、それがヒープ新生児に、オブジェクトのライフサイクルに基づいています

そして歳の代わりに。新世代において、なぜならオブジェクトの短い寿命、多数のオブジェクトが存在するであろう、ダイするたびに回復し

なぜ、複製アルゴリズムの使用に関する。オブジェクト高い生存率の古い時代には、タム割り当てられている余分なスペースがありません

または仕上げマーク - - スイープポールは、マークを使用することが可能です。

15.javaメモリモデル

Javaメモリー・モデル(JMM)は.JMMスレッドとメインメモリとの間の抽象関係を定義するスレッド間通信における制御機構です。

メインメモリ(主記憶装置)内のスレッド間のメモリ変数を共有し、各スレッドがプライベートローカルを有します

メモリ(ローカルメモリ)、ローカルメモリストアの読み取り/書き込みをスレッドのコピーは、変数を共有しました。ローカルメモリであります

JMM抽象的な概念、そして、それは本当ではありません。これは、キャッシュ、書き込みバッファ、レジスタやその他のハードウェアをカバー

部品とコンパイラの最適化。次のようにJavaのメモリモデルの要約図は以下のとおりです。

マップビューからは、スレッドAとBの間のスレッドが伝達されるように、それは以下の2つのステップを経る必要があります:

1.まず、更新AスレッドローカルメモリAは、メインメモリにフラッシュする変数を共有しました。

スレッドAは、共有変数を更新した前2.次に、スレッドBは、メインメモリに読み込みます。

16.javaクラスのロード処理?

7程度通過するJavaクラスのロード処理:

ロード

ファーストクラスのロード処理をロードするときは、この段階では、三つのことについて、完成します。

クラスの完全修飾名で取得1.このようなバイナリストリーム。

静的記憶バイナリ・ストリーム・データ構造の2構造はランタイム方式に変換されます。

3.は、このような入口へのデータアクセスとして、メモリにClassオブジェクトのクラスを生成します。

検証

検証の目的は、情報のバイトストリームクラスファイルが戻って仮想マシンに危険にさらすしないことを確実にするためである。この段階での主完了

ベルは、次の4つの点を確認してください。

1.ファイル形式の検証:現在の仮想でこのようなメジャーとマイナーバージョン番号などのクラスファイル、遵守のためのバイトストリームの検証

ある場合は、マシンの範囲は、一定のプール型の定数はサポートされていません。

2.メタデータの認証:このようなクラスは、集積か否かを、親クラスを持っているかどうかなどの情報意味解析バイトコード説明

継承されたクラスのように。

3.バイトコード検証:全体の検証プロセスは、データ・フローと制御フローを検証することによって分析した最も複雑な段階であります

主に検証方法のボディのために、正しいプログラムのセマンティクスかどうかを確認します。:型変換の方法が正しいことを、ジャンプ

命令は正しいと上のようです。

参照記号を確認してください。4.:このアクションは、主に分析操作が正しく実行できることを保証するために、解決プロセスの後ろに行われます

ライン。

レディ

メモリの準備段階では、割り当てられ、その過程でメモリ領域に移動します静的クラス変数として、デフォルト値に初期化されます

回線分散。準備フェーズオブジェクトのインスタンス変数がオブジェクトとしてインスタンス化されるときに、メモリ内のクラスのインスタンス変数を割り当てられていません

Javaヒープと一緒に配布。

公共の静的なint型の値= 123; //準備フェーズ値の初期値は0です。初期段階では変更されます

123。

解決

この段階では、直接変換シンボル参照の動作の完了は、引用されました。アクションは、必ずしも初期化動作の完了を解決しません

前に、初期化後にそこにあります。

初期化

初期化クラスの最後のステップは、ユーザアプリケーションによってローディング相中ことを除いて、フロントローディング方式をロードされます

作曲カスタムクラスローダが参加し、完全にアクションの残りの部分は、仮想マシンによって制御されている支配します。初期化フェーズに、本当に

Javaプログラムのコードは、クラスで定義され、実行を開始します。

Javaのクラスローディング機構の17の説明?

クラスについて説明し、仮想マシンのデータを解析し、メモリ、およびデータ検証にクラスファイルからロードされ、初期化し、最も

最終的に形成されたタイプは、直接Java仮想マシンを使用することができます。

18.親クラスローダ委譲モデルメカニズム?

クラスは、クラスのロード要求を受信したときに、自分自身は、クラスをロードするために行くが、親、親クラスにそれを委譲しますありません

親クラスをサブクラスバック、完全なロードへのクラスのサブクラスに、この時にロードすることができない場合は、ロードします。

19.クラスローダクラスローダは何とは何ですか?

コードブロックベースの命名機関によって実現は、クラスローダと呼ばれるバイナリバイトストリームクラスを取得しました。

ローダーの4種類について、があります。

1.ロードJavaのコアライブラリのクラスローダ(ブートストラップクラスローダ)、プログラムは直接のjavaすることはできません

参考文献。

2.拡張クラスローダ(拡張クラスローダは):Javaの拡張ライブラリをロードするために使用されます。Java仮想マシン

実装は、拡張ライブラリのカタログを提供します。このクラスローダは見つけると、このディレクトリにJavaクラスをロードします。

3.システムクラスローダ(システムクラスローダ):これは、クラスパスJavaアプリケーション(CLASSPATH)に基づいています

Javaクラスをロードします。一般的には、クラスのJavaアプリケーションは、それがロード完了までに作られています。によって

それを得るためにClassLoader.getSystemClassLoader()。

4.ユーザ定義のクラスローダは、クラスjava.lang.ClassLoaderの継承の方法によって達成しました。

20 DESCRIPTION Javaのメモリの割り当てと回収率と政策マイナーGCと主なGC

1.オブジェクトを優先エデンのヒープ領域を分配しました。

直接、古い時代に2.ラージオブジェクト。

オブジェクトの3.長期生存率は、古い時代に直接移動します。

十分に割り当てられたスペースエデンエリア、マイナーGC.Minor Gcを通じ仮想実行がない場合

多くの場合、新世代のエデンエリアで発生し、オブジェクトの有効期間は、この領域では短いです、私たちは発生Gcとの高い周波数を持っている傾向があります、

迅速な復旧、フルGC /主なGCは年に古いGCをトリガー、通常の状況下では、古い年に発生しました

マイナーGCをトリガしていない場合は、しかし、設定により全GCマイナー前に一度行うことができ、

GCこれは、古い時代の回収率をスピードアップすることができます。

おすすめ

転載: www.cnblogs.com/Java-JJ/p/12628529.html