これは、スタックは、主変数、オブジェクト参照の基本的なタイプを格納するために使用されるJava仮想マシンのスタック、ヒープ、方法エリア3つの領域に分けることができ、主記憶スタック・クラス・インスタンス、メソッド領域は静的変数、静的メソッド、定数プールを格納します。
1つのスタック機能
(1)スタック・メモリ・モデルは、実行の方法を説明するために使用されます。各方法は、(輸出のために格納されたローカル変数、オペランド)スタックフレームが作成されると呼ばれます。
(2)JVMスレッド(等実際のパラメータ、ローカル変数)の方法を実行するための情報を格納するため、各スタックのためのスレッドを作成します。
(3)スタックは、スレッドがプライベート、共有することはできません属します。
(4)ストレージスタック、FIFOの特性。
(5)は、自動的に高速、システムスタックによって割り当てられ、スタックは、連続したメモリ空間です。
2つのスタック機能
(1)作成されたオブジェクトと配列を格納するためのスタック。
(2)JVMは、すべてのスレッドによって共有される唯一のヒープです。
(3)スタックは、連続したメモリ空間、柔軟な割り当て、低速ではありません。
3方式エリア
(1)JVMは、すべてのスレッドによって共有される唯一の方法エリアです。
クラス情報関連した定数を格納するための(2)の方法、実際にヒープ領域。
(3)プログラム・スタックは、クラス情報、静的変数、静的メソッド、文字列定数として変更しないコンテンツを格納するために使用されます。
メモリ分析の4種類のプロセスを実行します
(1)クラスのインスタンスを
パッケージcn.latiny.normal。 / ** * @author Latiny * @version 1.0 * @description:ヒト *の@date 2019年8月2日11時25分 * / パブリック クラスHumanDemo { 公共 静的 ボイドメイン(文字列[]引数)スロー例外{ ストリートのストリート = 新しいです通り(); street.setName( "中华路" ); street.setNumber( 10000 ); 所在場所 = 新しい場所( "广东"、 "佛山" 、通り)。 人間の人間= 新しいヒト()。 human.setName( "Latiny" ); human.setAge( 99 )。 human.setLocation(位置) System.out.println(ヒト)。 } } クラスヒューマナ{ プライベート文字列名。 プライベート int型の年齢; 民間の場所の場所。 パブリック文字列のgetName(){ 戻り名。 } 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } 公共 のintgetAge(){ 戻り年齢; } 公共 ボイド setAge(int型の年齢){ この .age = 年齢。 } 公共の場所のgetLocation(){ 戻り場所、 } 公共 ボイドのsetLocation(所在地位置){ この .location = 場所。 } @Override パブリック文字列のtoString(){ 戻り "ヒト{" + "NAME =" '+名+ '\'' + "年齢=" +年齢+ "位置=" 「}」。 } } クラスLocationa { プライベート文字列州。 プライベート文字列の街。 プライベート・ストリートストリート。 公共Locationa(文字列州、文字列市、ストリートストリート){ この .province = 州; この .city = 都市。 この .street = 通り。 } パブリック文字列getProvince(){ 戻り地域を、 } 公共 ボイドsetProvince(文字列州){ この .province = 州。 } パブリック文字列getCity(){ 戻り都市; } 公共 ボイドsetCity(文字列市){ この .city = 都市。 } 公共ストリートgetStreet(){ 戻り通り。 } 公共 ボイドsetStreet(ストリート通り){ この .street = 通り。 } @Override パブリック文字列のtoString(){ リターン "ロケーション{" + "州= '" +州+ '\'' + "都市= '" +市+ '\'' + "ストリート=" +ストリート+ '}'。 } } クラスStreeta { ストリング名。 int型の数; パブリック文字列のgetName(){ 戻り名。 } 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } 公共 INT はgetNumber(){ 戻り番号; } 公共 ボイド setNumber(INTの数){ この .NUMBER = 番号。 } @Override パブリック文字列のtoString(){ リターン"ストリート{" + "NAME =" '+名+ '\'' + "番号=" +番号+ '}' 。 } }
プロセスクラスランタイムの(2)分析
1)メインメソッドHumanDemoクラスシステムは、米国からの命令を受信し実行し、Java仮想マシンのプロセスを開始します。
2)プロセスは、まずクラスパスからバイナリデータでファイルを読んで)コンパイルされ、その後見つけることではない場合(HumanDemo.classファイルを見つけ、HumanDemo方式エリアクラスランタイムデータ領域に格納される情報の種類静的メソッドと静的変数ながら定数(「中国道」、「広東省」、「佛」、「Latiny」)は、メソッド領域にクラスローディングプロセスとして知られるプロセスがロードされます。
バイトコード3)命令の実行を開始地域HumanDemoクラス()メソッドを、ターゲットにJava仮想マシンのメイン方法。
4)main()メソッドのスタックフレーム、コードの実装では、スタックを開きます。
ストリートストリート= 新・ストリート();
Java仮想マシン・インスタンスを作成すると、ストリート、ストリート参照変数は、一見単純なコードをこの例を挙げたが、基礎となるJVMは多くの作業を行っている、それはこれを実行する方法であるかどうかを確認するために、私たちが追跡するために、Java仮想マシンを見てみましょうタスク:
Java仮想マシンは指示通りに従ったインスタンスを作成する必要があるので、彼はすぐにゾーン法を行ってきました①、あなたは、地区が行う方法を、まだストリートクラス情報を持っている瞬間を見るための方法の結果を情報ストリートクラスのタイプを見つける必要がありますか?ストリートクラスをロードするために、Java仮想マシン、ストリートクラスメソッド地区に格納されている情報の種類。
②ストリートクラスが発見され、次はそれを仕事を始めました。Java仮想マシンは、第1の基準のストリートクラスメソッドエリアポイントを保持するのこの種の情報を、ヒープストリートの新しいインスタンスを作成ストリート。ここで言及した参考文献は、実際には、ストリートの例では、データ領域を格納するために、C言語のポインタに幾分類似するメモリアドレスでストリートクラスメソッドエリアに情報のタイプを指し、このアドレス。
スレッドがメソッドを呼び出すたび③Java仮想マシンプロセスでは、各スレッドは、各要素のスタックはスタックフレームと呼ばれ、メソッド呼び出しの一連の実行スレッドを追跡するために、メソッド呼び出しスタックを持っています時間枠は新しいメソッドスタックにプッシュされます。ここでは、フレームメモリは、動作中のパラメータ、ローカル変数や、一時的なデータを処理します。「=」ストリートは、main()メソッドで定義された変数である前に、私たちが見ることができる、それはローカル変数であるので、それは、Javaメソッド呼び出しスタックのメインスレッドのmain()メソッドの実装に追加されます。「=」の例を指すようになります。この変数ストリート・エリア・ストリートヒープ、つまり、それはインスタンスストリートに基準点を保持しています。
次のように実装プロセスを通じて、次のとおりです。
5)このプロセスは、2つのコードを実行し、以下
street.setName( "中国の道" );
street.setNumber( 10000);
定数プールエリア「中国の道」の方法を対象と名
割り当て番号10000
6)次のように、多くの作業を行うには、このコードのJVMは:
Location location = new Location("广东", "佛山", street);
① 加载Location类到方法区;
② 在堆内存中为Location 创建一个新对象,这个对象有指向方法区Location类的引用;
③ main方法栈帧中添加location 局部变量,并指向步骤二创建的对象(保存堆中的实例地址);
④ 给location 对象成员变量赋值,province指向常量池的"广东",city 指向 "深圳",street 指向前面创建的Street对象;
7)这段代码JVM执行过程与之前类似不再详细描述,具体如下图:
Human human = new Human(); human.setName("Latiny"); human.setAge(99); human.setLocation(location);