すべての時間が起こる終了しますが、私はあなたが終了し、なぜそれを明確にするために、前に終了することを示唆しています。にあるため技術的な理由(その開発の影響、彼ら自身のオフセット経路計画)、またはお金の終わりには、(も十分にピリオドを用意していない)、追随してはならない一つ一つがなくなっている私の同僚を見て、彼は盲目それらをインタビューするために始めました以下、正しく評価されていません。
(タイトルが高い場合、私が行ったとき、)面接の不十分な準備、完全な時間の無駄、それは自分自身のための責任を負いません。今日のもと知識Javaのインタビュー解決--jvmの基本を共有します
1)Javaはクロスプラットフォームを実現する方法ですか?
注:JavaではなくJVMよりも、クロスプラットフォームのプログラムです。異なるプラットフォームは、JVMの異なるバージョンをインストールする必要があります下JVMは、あなたは、クロスプラットフォームではありませんが、マシンコードがコンパイルされ、C / C ++開発を使用しています
:私たちは、Javaのソースコードで書かれている、の.classファイルが生成されますコンパイラは、バイトコードファイルと呼ばれます。Java仮想マシン(JVM)がいる限り、異なるプラットフォームにインストールされている対応するJVMとして、あなたはバイトコードファイルを実行することができ、我々は書き込み動作、つまり、ファイル内のマシンコードにバイトコードを翻訳して、プラットフォーム固有の実行のために責任がありますJavaプログラム。
このプロセスは、我々はすべての変更、「中間層」を通じてだけでJVMをしなかった書いたJavaプログラムは、目的を「一度、どこでも実行する」ように、異なるプラットフォーム上で実行することができるようになります。
2)JVMとは何ですか?
分析:基本的な概念ではないだけの役割だけでなく、JVM。
:JVM、すなわちJava仮想マシン、Java仮想マシン。これは、計算機能を備えたコンピュータのコンピュータシミュレーションによって達成されます。コンピュータアーキテクチャは、結合がJVMによって達成されるものに関連付けられた統一されたプラットフォームを提供するように、シールドが各コンピュータ・プラットフォームに関連付けられているJVMのソフトウェアまたはハードウェアとの間の差の主な原因であり、Javaバイトコードを実行するJVMを横切ることが可能です。
3)コンポーネントは何ですかJVM?
分析:これは、JVMのアーキテクチャの研究であります
:JVM構造は、本質的に4つの部分から構成されます。
クラスローダーは、JVMにロードされるJVMランタイムクラスまたはクラスを開始する必要があります
実行エンジンは、タスクの実行エンジンは、実際のマシン上で同等のCPUであるファイルに含まれるクラスのバイトコード命令を実装するための責任があります
メモリ領域は、メモリは、アナログストレージ、スケジューリングと実際のマシン上で、PCやレコーダポインタレジスタ各種機能として、実マシン上で機能モジュールを記録する、等で複数のゾーンに分割されています
ローカルメソッド呼び出し、メソッドは、CまたはC ++のネイティブコードが達成された結果を返す呼び出し
4)クラスローダはそれを理解しているのですか?
分析:クラスローダと同様に、基礎となる実装の一部の機能に関連する概念基本原則の調査。
:名前が示すように、クラスローダ(クラスローダー)は、Java仮想マシンにJavaクラスをロードします。一般的には、次のようにJavaクラスを使用して、Java仮想マシン:Javaソース(.javaファイル)は、Javaコンパイラの後にJavaバイトコード(.classファイル)に変換されます。
クラスローダは、Javaバイトコードを読み取るための責任がある、とjava.lang.Classクラスのインスタンスに変換します。Javaクラスのような各インスタンスが表すために使用されます。この例によってのnewInstance()メソッドは、そのクラスのオブジェクトを作成するために使用することができます。実際の状況は、このようなJavaバイトコードとして、より複雑かもしれ動的ツールによって生成されてもよいし、あるいは、ネットワークを介してダウンロードすることができます。
インタビュアー:Java仮想マシンのJavaは、2つのクラスが同じであるかを決定する方法ですか?
A:Java仮想マシンだけではなく、完全な名前のように見えると同じですが、またかなどクラスローダがロードされます。等しい2つだけの事は、我々は二つのクラスが同じであると考えます。異なるクラスローダによってロードされた後も同じバイトコードは、取得したクラスが異なっています。たとえば、Javaクラスcom.example.Sample、Sample.classは、コンパイル後のバイトコードファイルを生成します。二つの異なるクラスローダClassLoaderAは、それぞれ読み取りおよびClassLoaderB Sample.classこの文書を、クラスを表すためにjava.lang.Classクラスの2つのインスタンスを定義します。これらの2つの例は、同じではありません。Java仮想マシンのために、彼らは別のクラスです。オブジェクトのこの2つのクラスのそれぞれを割り当てるしようとすると、例外ClassCastExceptionが、実行時にスローされます。
どのように5)クラスローダは、クラスファイルをロードすることですか?
:ステップは、あなたがたときに通過する必要がJVMにクラスファイルをロードするクラスローダ図に示されています:
第一段階は、の.classファイルを見つけることであり、このファイルがメモリにロードされたバイトコードが含まれています
第二段階は、3つのステップ、すなわち、バイトコード検証、リンクされたクラスのクラスデータ構造解析と対応するメモリアロケーションテーブルと最後のシンボルに分割することができます
第三相は、等、静的プロパティと初期化クラスの割り当てであり、そして静的ブロックを行います
インタビュアー:あなたはそれについて詳しく説明することはできますか?
回答:
1.ロード
ロード・フェーズ中にクラスのロードロードされたバイナリデータのクラスを見つけ、ロードする最初のフェーズでは、仮想マシンは、3つのことを実行する必要があります。
クラスの完全修飾名で定義されたバイナリバイトストリームを取得します。
これは、ランタイムデータ構造領域法に静的記憶構造のバイトストリームを表します。
このようなデータ領域のエントリへのアクセス方法として、このクラスのJavaヒープのjava.lang.Classオブジェクトの代表を生成します。
開発者は、両方のクラスローダを提供するためにシステムを使用することができるため、クラスローディング、ローディング・フェーズの他のステージに対する制御最強のステージである(具体的には、動作は、クラスローディング位相を取得バイトのバイナリストリームです)読み込みが完了している、あなたはまた、読み込みが完了するために、独自のクラスローダをカスタマイズすることができます。
ローディング段階が完了した後、外部記憶方式エリアに応じて仮想マシンに必要なバイトのバイナリストリーム上の仮想マシンの形式だけでなく、Javaヒープ内のクラスのjava.lang.Classオブジェクトを作成し、我々が通過できるようにこれらのデータアクセスオブジェクトエリア。
2.接続
検証:ロードされたクラスの正確さを保証
最初のステップは、接続フェーズを確認することです、この段階の目的は、クラスに含まれる情報のバイトストリームファイルが自分自身の安全を危うくしません、現在の仮想マシンと仮想マシンの要件を満たしていることを確認することです。検証フェーズは、検査操作を大まかに4つの段階を完了されます。
ファイル形式の検証:クラスファイル形式に準拠してバイトストリームの検証;例えば:定数プールの種類の定数がある場合、初めか0xCAFEBABEは、仮想マシンの現在の処理範囲でメジャーとマイナーバージョン番号は、サポートされていません。 。
メタデータの認証:説明バイトコード情報セマンティック分析(注:意味分析フェーズコントラストjavacコンパイラ)、Java言語仕様の要件の遵守を確実にするための情報が記載されており、例えば:クラスは、Java以外は、親クラスを持っているかどうか外.lang.Object。
バイトコード検証:データフローと制御フロー解析プログラムのセマンティクスを決定するためには、正当な論理です。
シンボリック参照の検証:分析操作が適切に行われることを保証します。
検証フェーズは非常に重要であるが、必ずしもそうではない、プログラムの実行には影響を与えません、繰り返し検証した後、参照クラスの場合、仮想マシンのクラスを減らすために、クラスの検証措置のほとんどをシャットダウンする-Xverifynoneパラメータを使用することを検討してくださいロード時間。
調製:クラス静的変数のメモリを割り当て、そのデフォルト値を初期化します
準備フェーズは、正式にクラス変数にメモリを割り当て、ステージクラス変数の初期値に設定され、このメモリは、メソッド領域に割り当てられます。次のポイントは、この段階に注意を払う必要があります。
このメモリの割り当て時間は①のみクラス変数(静的)を含み、オブジェクトはヒープJavaでインスタンス化されるとき、配信オブジェクトとインスタンス変数、インスタンス変数を含んでいません。
②初期値は、典型的には、ここで設定されている場合は、値はJavaコードで明示的に与えられているのではなく、ゼロのデフォルト値(例えば、0,0L、ヌル、偽など)のデータ・タイプです。
仮定変数は、クラスとして定義されます:public static int値= 3。
この時間はまだJavaメソッドを開始していない、とクラスのコンストラクタに格納されたプログラムがコンパイルされた後のpublic static-コマンドを割り当てられた値は、<clinitので、変数値は、初期準備段階では、代わりに3の0で、後値は、アクション3に割り当てられるように>()メソッドのうち、初期化段階中に実行されるであろう。
以下の点に注意を払う必要もあります。
クラス変数のための基本的なデータ型、(静的)と、グローバル変数、明示的に使用する前に、その直接の使用を割り当てるシステムはそれをゼロのデフォルト値を代入し、ローカル変数のためにされていない場合あなたは明示的に割り当てる必要があり、または時間をコンパイルしないでください。
修正静的最終的な定数しばらくの間、それは明示的に宣言時に割り当てられる必要があり、そうでない場合は、時間をコンパイルしません。定数の唯一最終修正あなたは明示的にも、声明の中で、それを割り当てることができます明示的に明示的にゼロのデフォルト値を与えるものではありません彼らのシステムを割り当てる必要があり、使用する前に、短いでは、初期設定の場合に値を割り当てることができます。
基準は、例えば、他のオブジェクトへの参照は、明示的にシステムに直接使用ゼロの値を割り当てられない場合、すなわちヌル、デフォルト説明する配列参照としてデータ・タイプへの参照です。
値がアレイの初期化中にアレイ内の各要素に割り当てられていない場合、前記要素は、対応するデータの種類に応じて、ゼロのデフォルト値が与えられます。
③一定値クラス属性フィールド属性テーブルのフィールド、すなわち、同時に最終的な静的変形は、その後、準備段階変数値は、プロパティConstValueによって指定された値とが初期化されている場合。
上記の値は、クラス変数は次のように定義されているものとする:のpublic static final int値= 3。
あるJavac仮想マシンの準備段階では、一定値プロパティ値を生成する時間が一定値を3に割り当てられた値を設定するベースとなるコンパイル。私たちは、そのクラスを呼び出すために一定のプールになり、コンパイル時に静的最終定数として理解することができます
分析:クラスが直接参照シンボル参照に変換され、
解像度相を仮想マシンプロセスの定数プールはシンボリック参照直接参照、主修飾子クラスまたはインタフェース、フィールド、メソッド、クラス、インタフェースメソッド、タイプ方法の分析操作を置き換え、および方法は、クラスリファレンスシンボルの7点を扱うコールされます。シンボリック参照は、任意のリテラルであることができるターゲットを記述するためのシンボルの集合です。
直接参照は、間接又は測位対象ハンドルに対してオフセット、オブジェクトへの直接のポインタです。
3.初期化
初期化、静的変数のクラスのための正しい初期値を与え、メインクラス変数を初期化するための責任JVMクラスが初期化されます。二つの方法でJavaクラスの変数に設定された初期値:
①宣言するクラス変数を初期値に指定されています
②静的コードブロックを使用して、クラス変数の初期値が代入され
JVMの初期化ステップ
図1は、クラスがロードされ、接続されており、そのプログラムに接続されていない場合は、クラスをロードします
直接の親クラスが初期化されていない場合は2、それは最初にその直接の親を初期化
図3に示すように、クラス初期設定ステートメント場合、システム順次初期設定ステートメントを実行します
クラスの初期化タイミング:クラスの初期化の積極的な使用は、クラスをリードするときにのみ、積極的に使用するクラスは、次の6つのものがあります。
クラスのインスタンスを作成し、新しい方法であります
アクセス静的クラスまたはインタフェースの変数、または静的変数の代入
静的メソッド呼び出しクラス
リフレクタ(例えばClass.forNameの( "com.shengsiyuan.Test"))
クラスのサブクラスを初期化し、親クラスが初期化されます
Java仮想マシンは、マスタークラス、直接のjava.exeコマンドを実行するために、クラスのクラス(JavaTest)を開始するようにマークされ始めたとき
人生の終わり
以下の状況では、Java仮想マシンは、ライフサイクルを終了します
でSystem.exit()メソッドの実装
通常のプログラム実行が終了
中止され、実行中に例外やエラーが発生しました
オペレーティング・システム・エラーがJava仮想マシンを終了させるプロセスを引き起こしたので
6)親委譲モデル(親委任モデル)?
分析:ロードクラスの親は、より良いのJavaプラットフォームを保証することができます委任メカニズム、セキュリティ・メカニズムを採用します
以下に示すような階層構造を有するClassLoaderクラスローダは、すなわち、親子関係は、ブートストラップローダに基づいて、前記全ての父です。
このモデルは、クラスローダの残りの部分は、自身の親クラスローダを持っている必要があり、また、トップブートストラップクラスローダのブートクラスローダが必要です。子と親クラスローダクラスローダは、(継承)の関係が達成される連続してではなく、と親コードローダ(組成物)の関係を組み合わせることにより、多重化。)同じ各クラスローダは、ローダの(独自の名前空間を持っており、同じ名前空間内のすべての親クラスローダロードされたクラスは、クラス名は、パッケージを含む(完全には表示されません。 2つのクラスは、異なる名前空間に、)同じクラスの2つ(のパッケージを含む)完全なクラス名があるかもしれません
インタビュアー:親が仕事のプロセスモデルを委任?
回答:
すでに元既にロードされたクラスに直接ロードした場合1.彼の既にロードされたクラスから現在のClassLoader最初のクエリは、このようなは、ロードされていません。
各クラスは、クラスが後になりますキャッシュにロードされたときに、独自のローダは、キャッシュをロードしています
だから、次回はあなたが直接返さ読み込むことができます。
2.現在のClassLoaderが最初にロードするために、親クラスの親クラスを委譲そして、そのキャッシュをチェックし、ロードするために親クラスローダの委託キャッシュロードされたクラス、同じ戦略を使用して、親クラスローダでは見られない、となっていますClassLoaderをブートストラップします。
親クラスローダの全てがロードされ、その後、現在のクラスローダによってロードされ、そして、自身のキャッシュに配置されていない場合はその次の時間に直接ロード要求リターンがあります。
インタビュアー:なぜあなたが設計していますか?
分析:これは、アキュムレータを整理するために、このモデルを使用しての利点であります
:メインは、ユーザーが記述したクラスは、同じクラスファイル、StringなどのコアJavaクラス動的置換、のいくつかを回避するために、だけでなく、JVMが異なるクラスだけでなく、クラス名を区別するため、繰り返し荷重を避けるために、セキュリティのためであります相互変換は、その後、java.lang.ClassCaseExceptionがスローされます場合は、異なるクラスローダは、2つの異なるクラスでロード。
この情報は、小扁は最近、上記の情報を取得したい、整理して、数ヶ月の時間を費やしている、リンクをクリックしてhttps://jq.qq.com/?_wv=1027&k=5CrpwVu無料で入手します