Java仮想マシンのメモリ構造の深い理解からの質問に直面しています

私はちょうど丸暗記でインタビューに対処するために、狂気オンラインはJAVAの質問にブラシをかけ、大学を卒業し、それらの多くを覚えています。でインタビューの質問適切な方法は、非常に深く感銘を受け、この質問に沿ってインタビュアーの巨人は、そこにダウン尋ね、および知識のJava仮想マシンに尋ねた、そして最終的に私が住んでいるように頼まれています。
私は顔がこれですでした。

その後、私は他の人にインタビューする機会があった、とも質問を前方に来て、彼の考えに基づいて、多くは2年、プログラマー、結果のために働いていると私のような、すべてのJava仮想マシンの知識で失われた、でした。

私たちは、顔の質問を見てみましょう。

String str1 = "hello Alunbar";
String str2 = new String(str1);

いくつかのオブジェクトが作成されますか?

オンライン与えられた説明は、ヒープ上の2つのオブジェクト、定数プールでSTR1オブジェクト、STR2のオブジェクトを作成することです。

以下は、インタビュアーと私の対話です。
インタビュアー:上記のコードはいくつかのオブジェクトを作成しますか?
I:2。
インタビュアー:なぜそれは2ですか?
I:STR1定数プール内のオブジェクト、str2のオブジェクトヒープ上。「=」等号とリターンアドレスへの直接参照があり、既に文字列オブジェクトが存在する文字列オブジェクトは、最初の文字列定数プールに見て作成し、文字列オブジェクトを作成し、参照アドレスを返します。

インタビュアー:なぜ文字列オブジェクト定数プールを作成しますか?
I :. 私は恥ずかしい答えを知らない、半分分のためにそれについて考えました。
インタビュアー:メモリJVM仮想マシンの構造について教えてください。
I :. 私は再びひるまない、状況は非常に恥ずかしかったです。

インタビュー終了後、私は、関連する知識JVM仮想マシンを理解し、必死に情報を見つけるために戻って行きました。

これが私の最初のインタビューで、非常に深く感銘を受けました。

私は二つの問題の面接についてお話しましょう。
1、なぜ文字列オブジェクト定数プールを作成します。
2、Java仮想マシンのメモリ構造。

まず最初の質問を見てください。
なぜ文字列オブジェクト定数プールを作成しますか?

すべてのプログラミング言語の文字列は、最も一般的なタイプです、他のデータ型はint型のような、長い、など、文字列型に変換することができ、基本的なデータ型であり、文字列は、相互に変換することができます。文字列の利用効率を向上させるために、JVM仮想マシンオブジェクトの基本データ・タイプを記憶するためのメモリの特別な定数プールを設定し、オブジェクトは、互いに一定のプールを共有することができ、もちろん、文字列が含まれます。

私たちは、一般的に、文字列定数プールへの文字列の定数プールに格納されます。Stringクラスは、最終的な修正されているため、文字列定数プールはすでにの多くは、文字列オブジェクトが作成され、その値は、作成一度に変更することはできませんので、我々は、文字列は、共有オブジェクトとカオスプログラムを持って心配しないでください。

私たちは、コードのセクションを見てください:

String s1 = "Hello";
String s2 = "Hello";

このコードは、1つのオブジェクトのみを作成し、S1、S2が同じオブジェクトです。上記の解釈によると、java String s1 = "Hello"このコード行は、まず、Helloオブジェクトが見つからない文字列定数プールを探しHelloオブジェクトを作成し、S1への参照を返します。java String s2 = "Hello"このコードの行でなく、文字列定数プールHelloオブジェクトを見つけるために行くためには、すでにプロセスが直接、S2に戻り、存在することがわかりました。したがってS1、S2が同じオブジェクトです。

そして、文字列オブジェクトを作成し、新規の使用について話しています。
新しい文字列オブジェクトを作成し、新しいメソッドを使用して、ストレージの文字列Stringオブジェクト、新しいヒープメモリ空間で開きますに関係なく、新しい一貫して使用する文字列の内容は、文字列を作成するかどうかの、新しい文字列オブジェクトを生成します。 、ヒープオブジェクトがリサイクルされるオブジェクトはヒープに存在する文字列を作成し、使用して「=」復元されることはありません定数プールに格納された文字列オブジェクトを作成しますので、我々は不必要を避けるために、「=」のアプローチを使用することをお勧めしますJavaオブジェクトの作成と破壊のオーバーヘッド。

私たちは、メモリ構造は、文字列オブジェクトを作成するには、次のチャートを見てみましょう。

s1とs2がs3の実施形態では、S3とS1、新しい文字列オブジェクトを使用して作成され、そのメモリアドレスが同じで、作成された「=」文字列オブジェクトである、s2のメモリアドレスは同じではありません。

さて、次に2番目の質問を見てください。

メモリ構造のJava仮想マシン
、仮想マシンのメモリ構造は、各メモリ領域の主要話す役割についてそこに話すことができる、非常に複雑な問題です。

クラスローダ、データ領域、およびランタイム実行エンジンの設定によって、Java仮想マシン。下図のように:

通常、私たちは、Java仮想マシンのメモリ構造は、ランタイムデータ領域について話していると言います。

プログラムカウンタ、メソッドエリア、仮想マシン・スタック、ネイティブメソッドスタック、ヒープ:Java仮想マシンのJavaプログラムの実行は、メモリはいくつかの領域に分割されます。

その中でも、方法およびヒープ領域は、スレッドは、プログラムカウンタ、仮想マシン・スタック、ネイティブメソッドスタックを共有していない、スレッドを共有しています。

1は、プログラムカウンタ
限り学んアセンブリ言語として、このプログラムカウンタが理解しやすい、実行されるバイトコード命令の下に記録されています。

あなたがプログラムを起動したときに私たちは、オペレーティングシステムの知識を知って、Java仮想マシンでプロセスを、それがプロセスを作成しますので、Javaプログラムの実装では、プロセスを作成します。

複数のスレッドからなるプロセスは、任意の時点で、Java仮想マシンは、命令の唯一のスレッドを実行することができます。

スレッドの一つのスレッドがデータベース、ジャンプ、例外処理、スレッドの回復を読んで、そのようなサイクリングなどの基本的な機能を実行する必要があるかを決定するために、プログラムカウンタを読み取ることで、Java仮想マシン。

したがって、プログラムカウンタの各スレッドは、互いに独立しており、互いに影響を与えます。

2、Java仮想マシンのスタックが
実装方法では、我々は多くの場合、Javaスタックを言うことで、情報、オペランドスタック、メソッドの輸出を保存するためのJavaスタック、ローカル変数テーブル内のスタックフレームを作成します。

ブール、文字やデータの他の基本的なタイプのようなオブジェクト参照、あなたがメソッドを実行する必要があり、ローカル変数テーブルに格納されます。ローカル変数テーブルのサイズは、コードのコンパイル時に決定されています。Javaスレッド・スタックは、プライベートです。

あなたは、Javaスタックを作成するために、スレッドの終了をスレッド同期を作成すると、Javaスタックも破壊され、占有メモリを解放します。

3、ネイティブメソッドスタック
と、Java仮想マシン、仮想マシンのスタックとスタックをマージネイティブメソッドの一部をJava仮想マシン機能と同様スタック。仮想マシンのネイティブメソッドスタックは、主にサービスを提供するネイティブな方法です。

図4は、Javaヒープ
メモリの最大領域内の仮想マシンは、仮想マシンがこのメモリ領域は、すべてのスレッドによって共有され、主にオブジェクト・インスタンスを格納するために使用される、作成し始めます。この地域のオブジェクトは、すべてのスレッドがアクセスすることができます。

このエリアには、対象のJava仮想マシン管理焦点である、オブジェクトのこの領域が参照されていない場合、リサイクル基準に到達し、占有スペースの内容物を放出するためにJavaのガベージコレクタをリサイクルされます。

新世代と古い時代にJavaヒープは、新生代はサバイバーからサバイバー空間と空間に、Eden領域に分割されています。

あなたはnew演算子を使ってオブジェクトを作成すると、これは、オブジェクトを格納するために使用されるメモリ領域を開きます。

上記のjava String str1 = new String("Hello")文字列を作成し、それはSTR1オブジェクトを格納するために使用されるJavaヒープメモリに開きます。

5.メソッド領域
の主記憶領域は、仮想マシンのクラス情報、定数、変数や他の静的データのメソッドをロードされ、私たちはこの地域の永続的な世代のメモリと呼ばれるメモリのこの領域になります回復されることはありません。
Javaヒープおよびメソッド領域と同様に、すべてのスレッドで共有。

メソッド領域は、実行時定数プールが含まれ、上記java String str = "Hello"作成された文字列は、実行時定数プール「こんにちは」オブジェクトで作成されます。

概要:
1、文字列オブジェクトの違いを作成する2つの方法。
2、Java仮想マシンのメモリ領域の役割。

おすすめ

転載: www.cnblogs.com/airnew/p/11614031.html