1. Javaオブジェクトを作成するためのプロセスを説明して?
クラスが1.1ロードされているかどうかを検出します
するかどうか新しい命令、ファーストクラスの定数プールで参照されるシンボルを見つけることができ、このコマンドのパラメータをチェックし、クラスを代表して、このシンボリック参照をチェックするためには、ロードされ解析され、初期化されている仮想機会か。ない場合は、適切なクラスのロード処理を実行する必要があります。
新しいクラスの1.2メモリを割り当て
クラスローダによって検査した後、仮想マシンは、新生児オブジェクト割り当てメモリ、必要なメモリサイズは完全にクラスが完成ローディング・オブジェクトを有した後に確立することができるであろう。
ゼロの1.3初期値
メモリの割り当ては、メモリ空間を割り当てるために、仮想マシンのニーズを完了した後(管理オブジェクトを含まない)がゼロの値に初期化され、オブジェクトのフィールドを直接使用Javaコードで初期値を割り当てられないことを確実にするために、この工程の例として、アクセスプログラム対応するフィールドのデータ型のゼロ値。
1.4必要な設定を行います
仮想マシンは、このオブジェクトは、メタデータは、ハッシュ・オブジェクト行い、GC対象副情報世代の年齢などの情報を検索する方法、クラスのインスタンスである、例えば、必要な設定の対象となります。この情報にオブジェクトヘッダーオブジェクトに格納されています。
1.5使用のinitメソッド
<整数>方法が行われていない、上記の作業が完了した後、仮想マシンの観点から、新しいオブジェクトが作成されましたが、ビューのJavaのプログラム点の観点から、オブジェクトの作成が始まったばかり、すべてのフィールドはまだゼロです。だから、一般的には、新しい命令を実行した後に、次に考えられ、実際のオブジェクトが完全に出てくるように、オブジェクトを初期化するために、プログラマの希望に合わせて、の<init>メソッドを実行します。
オブジェクトを作成する2.java方法はありますか?
新しいキーワードを使用します | }→コンストラクタが呼び出されます |
クラスClassのnewInstanceメソッドを使用して | }→コンストラクタが呼び出されます |
クラスのnewInstanceを使ってコンストラクタメソッド | }→コンストラクタが呼び出されます |
cloneメソッドを使用して | }→コンストラクタを呼び出しません |
使用デシリアライゼーション | }→コンストラクタを呼び出しません |
3. Javaのメモリモデルについての話?
Java仮想マシンとコンピュータメモリのJavaのメモリモデルの仕様は、一緒に仕事する方法です。Java仮想マシンは、このモデルでは、Javaのメモリモデルとして知られているメモリモデルを含み、コンピュータの完全なモデルです。
Java仮想マシン内のJavaメモリモデルプットは、スレッドヒープとスタックに分かれています。
Java仮想マシンを実行している各スレッドは、独自のスレッドスタックを持っています。このスレッド・スタックは、呼び出し側スレッドが現在の実行ポイントである方法に関する情報を含みます。スレッドは、独自のスレッドスタックにアクセスすることができます。スレッドの作成ローカル変数は、自分だけが見える他のスレッドには表示されません。各スレッドは、各ローカル変数の独自のバージョンを持っています。
ヒープにかかわらず、作成されたオブジェクトの、Javaプログラムで作成されたすべてのオブジェクトを含みます。これは、オブジェクト・タイプの元のバージョンを含みます。オブジェクトが作成され、ローカル変数に割り当てられた、または別のオブジェクトのメンバ変数として使用する場合、オブジェクトはまだヒープ上に格納されています。
ローカルコールスタックとスレッドスタックに保存されたローカル変数はヒープに格納されたオブジェクト。
4.static変数が格納されていますか?
図1に示すように、スタック領域(スタック) -コンパイラ、ストレージによって割り当て自動的に解放パラメータ関数の値は、ローカル変数など。
図2に示すように、ヒープ領域(ヒープ) - プログラマが解放しない場合、通常、プログラマによって割り当てを解除され、手順OSの終了によって回収することができます。それは同様の配布リストに触れ、全く別のスタックデータ構造であることに注意してください。
図3に示すように、グローバル・ゾーン(静止ゾーン)(静的) - グローバルおよび静的変数である、のいずれかに格納されている領域にグローバルおよび静的変数を初期化し、初期化されていないグローバル変数と静的変数は、隣接する未初期化地域の他の作品。プログラムの後、システムのリリースがあります。
4、リテラルエリア-定数文字列がここに置かれています。システムによって放出されたプログラムの終了後。
図5に示すように、プログラムコード領域 - バイナリコード記憶された関数本体。
5.volatileについて教えて?
揮発性の異なるスレッドへのアクセスによって変更された変数を変更するように設計され、型修飾子です。揮発性型定義は、対応するメモリシステムの中から、使用するたびに変数抽出されます。キャッシュを使用しません。揮発性のメンバ変数を変更した後、あなたは変数の値を参照して、いつでもすべてのスレッドは同じです。
共有変数に一度(クラスのメンバ変数、静的メンバ変数のクラス)volatile宣言された後、2つの意味を持っています:
可変のスレッド修正値であり、この変数操作、異なるスレッドが、他のスレッドにこの新しい値が直ちに表示されている場合1)の視認性を確保します。
2)禁止命令の並べ替え。
6.どのように同期スレッドには?
6. 1. 修正?キーワードどのような同期方法 synchronizedキーワードで修飾した同期方法を
6.2。 同期は達成するためにはいくつかの方法が、何であるか?ある待って通知し、同期されています
待機():待機状態にスレッドを作成し、オブジェクトが保持しているロックを解放します。
睡眠():スリープ状態で実行中のスレッドを作成し、それは静的なメソッドが例外:InterruptedException例外をキャプチャするために、このメソッドを呼び出しています。
通知():優先順位によって目覚めるではなく、このメソッドが呼び出されたときに、正確に一つのスレッドの待機状態を覚ますていないことを指摘し、待機状態のスレッドを覚ますが、JVMのスレッドによって決定されます。
notityAll():すべてのオブジェクトをロックするスレッドを覚ますが、それらは競争させないことに注意してください、すべての待ち状態にスレッドを覚まします。
6.3。 (揮発性)特殊フィールド変数を使用して、スレッドの同期を実現する、最終的な変数を修正することができません
a.volatileキーワードは、変数ロックフリー機構のドメインへのアクセスを提供
Bを。揮発性の修正ドメインを使用して、他のスレッドの更新かもしれないドメインに仮想マシンを伝えることと等価である
C。ですから、そのドメインを使用するたびに再計算され、代わりに、レジスタの値を使用する
d.volatile任意アトミック操作を提供しない、変数の最終的な種類を変更するために使用することができません
スレッド同期のための再利用ロックの6.4を使用
6.5。スレッドの同期を達成するために、ローカル変数を使用します
7.プロセスとスレッドの違いは?
(1)アドレス空間:プロセス内の実行ユニットと、プロセスは、少なくとも一つのスレッドを有し、それらはプロセスのアドレス空間を共有し、そしてプロセスは、独自の別個のアドレス空間を有しています。
(2)資源の所有者:プロセスは、同じプロセスのスレッド内のリソース割り当てとリソースの単位によって所有されているプロセスを共有します
(3)スレッドがプロセッサスケジューリングの基本単位であるが、プロセスではありません。
(4)その両方が同時に実行できます。
プロセスがリソース割り当ての基本単位であり、スレッドスケジューリングの基本単位です。プロセスは、スレッドは、スレッドは、プロセスのリソースを共有含まれています。