jvm学習3日目
今日は仕事が少し忙しいので、勉強する時間がないので、急いで補充しましょう.
昨日からclassファイルの構造を勉強して、今日続けます.
一、classクラスファイル構造
Classファイルは、8バイト単位のバイナリストリームのセットです.
Java仮想マシンの規定によると、ClassファイルフォーマットはC言語構造体に似たマイクロ構造を採用して格納され、この擬似構造は2つのデータ型しかありません.シンボル数とテーブルがありません.
1、魔数とClassファイルのバージョン、以下はueからコピーした16進数の断片です
00000000h: CA FE BA BE 00 00 00 32 00 16 07 00 02 01 00 1B ; 漱壕...2.....
00000010h: 63 6F 6D 2F 73 74 72 75 74 73 2F 61 63 74 69 6F ; com/struts/actio
00000020h: 6E 2F 54 65 73 74 43 6C 61 73 73 07 00 04 01 00 ; n/TestClass.....
00000030h: 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 ; .java/lang/Objec
00000040h: 74 01 00 01 6D 01 00 01 49 01 00 06 3C 69 6E 69 ; t...m...I...00000050h: 74 3E 01 00 03 28 29 56 01 00 04 43 6F 64 65 0A ; t>...()V...Code.
00000060h: 00 03 00 0B 0C 00 07 00 08 01 00 0F 4C 69 6E 65 ; ............Line
00000070h: 4E 75 6D 62 65 72 54 61 62 6C 65 01 00 12 4C 6F ; NumberTable...Lo
00000080h: 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 ; calVariableTable
00000090h: 01 00 04 74 68 69 73 01 00 1D 4C 63 6F 6D 2F 73 ; ...this...Lcom/s
000000a0h: 74 72 75 74 73 2F 61 63 74 69 6F 6E 2F 54 65 73 ; truts/action/Tes
000000b0h: 74 43 6C 61 73 73 3B 01 00 03 69 6E 63 01 00 03 ; tClass;...inc...
000000c0h: 28 29 49 09 00 01 00 13 0C 00 05 00 06 01 00 0A ; ()I.............
000000d0h: 53 6F 75 72 63 65 46 69 6C 65 01 00 0E 54 65 73 ; SourceFile...Tes
000000e0h: 74 43 6C 61 73 73 2E 6A 61 76 61 00 21 00 01 00 ; tClass.java.!...
000000f0h: 03 00 00 00 01 00 02 00 05 00 06 00 00 00 02 00 ; ................
00000100h: 01 00 07 00 08 00 01 00 09 00 00 00 2F 00 01 00 ; ............/...
00000110h: 01 00 00 00 05 2A B7 00 0A B1 00 00 00 02 00 0C ; .....*?.?.....
00000120h: 00 00 00 06 00 01 00 00 00 03 00 0D 00 00 00 0C ; ................
00000130h: 00 01 00 00 00 05 00 0E 00 0F 00 00 00 01 00 10 ; ................
00000140h: 00 11 00 01 00 09 00 00 00 31 00 02 00 01 00 00 ; .........1......
00000150h: 00 07 2A B4 00 12 04 60 AC 00 00 00 02 00 0C 00 ; ..*?..`?......
00000160h: 00 00 06 00 01 00 00 00 07 00 0D 00 00 00 0C 00 ; ................
00000170h: 01 00 00 00 07 00 0E 00 0F 00 00 00 01 00 14 00 ; ................
00000180h: 00 00 02 00 15 ; .....
各Classファイルの最初の4バイトは魔数となり、その唯一の役割はこのファイルが仮想マシンに受け入れられるclassファイルであるかどうかを決定することであり、多くのファイル標準は魔数アイデンティティ識別を採用しており、拡張子ではなく魔数を使用するのは主に安全のためであり、ファイル拡張子が勝手に変更できるためである.
ははは、興味深いことに、classファイルの最初の4バイトは0 xCAFEBABE(コーヒーベイビー)です.
1行のClassファイルをueで開いた16進数の内容を分析しましょう.
CA FE BA BE 00 00 00 32
最初の4バイトはClass形式であり、5番目と6番目はセカンダリバージョン番号であり、プライマリバージョン番号の値は0 x 0032、すなわち10進数の50であり、このバージョン番号はjdk 1.6以上のバージョンの仮想マシンで実行可能なClassファイルであることを示している.
2、定数プール
定数プールはプライマリ・セカンダリ・バージョンの直後であり、定数プール内の定数の数は固定されていないため、定数プールのエントリには、定数プールカウント値を表すu 2タイプのデータ、すなわち2バイトのデータを配置する必要があります.定数プールに21個の定数があることを表す0 x 0016、すなわち10進数の22.
定数プールには主に2つの定数が格納されています.字面量と記号参照、字面量はjava言語レベルの定数概念に近いです.例えば、テキスト文字列、finalの定数値として生命されるなどです.記号参照はコンパイル原理の概念に属します.以下の3種類が含まれています.
(1)クラスとインタフェースのフルネーム
(2)フィールドの名前と記述子
(3)メソッドの名前と記述子
他の押し倒しは疲れず、詳しくは見ていませんが、要するに、16進数フォーマット文字は前述の表のデータに対応し、意味があり、最終的には元のjavaファイルに翻訳することができます.
二、仮想マシンクラスのロードメカニズム
仮想マシンはクラスを記述するデータをClassファイルからメモリにロードし、データを検証、変換解析、初期化し、最終的に仮想マシンに直接使用できるjavaタイプを形成します.これが仮想マシンのクラスロードメカニズムです.
Java言語では、タイプのロードと接続プロセスはプログラムの実行中に完了します.これにより、クラスのロード時に少しオーバーヘッドが増加しますが、javaアプリケーションに高度な柔軟性を提供します.javaで生まれつき動的に拡張できる言語特性は、実行期間の動的ロードと動的接続という特徴によって実現されます.
クラスは、仮想マシンメモリにロードされてから始まり、メモリがアンインストールされるまでのライフサイクル全体に、ロード、検証、準備、解析、初期化、使用、アンインストールの7段階が含まれます.検証の準備と解析を総称して接続と呼びます.
初期化フェーズでは、仮想マシンがこの4つのみを規定している場合、クラスを初期化する必要があります(ロード、検証、準備は自然にその前に開始する必要があります)
(1)new,getstatic,putstaticまたはinvokestaticの4つの命令コードに遭遇し,この4つの命令コードを生成する最も一般的なjavaコードシーンは,newキーワードを用いてオブジェクトをインスタンス化し,クラスの静的フィールド(final修飾され,コンパイル期間中に結果を定数プールの静的フィールドに入れた場合を除く)を読み取り,設定し,クラスの静的メソッドを呼び出す場合である.
(2)java.lang.reflectパケットのメソッドを用いてクラスを反射呼び出した場合
(3)1つのクラスを初期化する場合,親がまだ初期化されていないことが判明した場合は,まずその親の初期化を開始する必要がある.
(4)仮想マシンが起動すると,ユーザはmain()メソッドのクラスを含む実行するプライマリクラスを指定する必要があり,仮想機会はまずこのプライマリクラスを初期化する.
昨日からclassファイルの構造を勉強して、今日続けます.
一、classクラスファイル構造
Classファイルは、8バイト単位のバイナリストリームのセットです.
Java仮想マシンの規定によると、ClassファイルフォーマットはC言語構造体に似たマイクロ構造を採用して格納され、この擬似構造は2つのデータ型しかありません.シンボル数とテーブルがありません.
1、魔数とClassファイルのバージョン、以下はueからコピーした16進数の断片です
package com.struts.action;
public class TestClass {
private int m;
public int inc(){
return m+1;
}
}
00000000h: CA FE BA BE 00 00 00 32 00 16 07 00 02 01 00 1B ; 漱壕...2.....
00000010h: 63 6F 6D 2F 73 74 72 75 74 73 2F 61 63 74 69 6F ; com/struts/actio
00000020h: 6E 2F 54 65 73 74 43 6C 61 73 73 07 00 04 01 00 ; n/TestClass.....
00000030h: 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 ; .java/lang/Objec
00000040h: 74 01 00 01 6D 01 00 01 49 01 00 06 3C 69 6E 69 ; t...m...I...
00000060h: 00 03 00 0B 0C 00 07 00 08 01 00 0F 4C 69 6E 65 ; ............Line
00000070h: 4E 75 6D 62 65 72 54 61 62 6C 65 01 00 12 4C 6F ; NumberTable...Lo
00000080h: 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 ; calVariableTable
00000090h: 01 00 04 74 68 69 73 01 00 1D 4C 63 6F 6D 2F 73 ; ...this...Lcom/s
000000a0h: 74 72 75 74 73 2F 61 63 74 69 6F 6E 2F 54 65 73 ; truts/action/Tes
000000b0h: 74 43 6C 61 73 73 3B 01 00 03 69 6E 63 01 00 03 ; tClass;...inc...
000000c0h: 28 29 49 09 00 01 00 13 0C 00 05 00 06 01 00 0A ; ()I.............
000000d0h: 53 6F 75 72 63 65 46 69 6C 65 01 00 0E 54 65 73 ; SourceFile...Tes
000000e0h: 74 43 6C 61 73 73 2E 6A 61 76 61 00 21 00 01 00 ; tClass.java.!...
000000f0h: 03 00 00 00 01 00 02 00 05 00 06 00 00 00 02 00 ; ................
00000100h: 01 00 07 00 08 00 01 00 09 00 00 00 2F 00 01 00 ; ............/...
00000110h: 01 00 00 00 05 2A B7 00 0A B1 00 00 00 02 00 0C ; .....*?.?.....
00000120h: 00 00 00 06 00 01 00 00 00 03 00 0D 00 00 00 0C ; ................
00000130h: 00 01 00 00 00 05 00 0E 00 0F 00 00 00 01 00 10 ; ................
00000140h: 00 11 00 01 00 09 00 00 00 31 00 02 00 01 00 00 ; .........1......
00000150h: 00 07 2A B4 00 12 04 60 AC 00 00 00 02 00 0C 00 ; ..*?..`?......
00000160h: 00 00 06 00 01 00 00 00 07 00 0D 00 00 00 0C 00 ; ................
00000170h: 01 00 00 00 07 00 0E 00 0F 00 00 00 01 00 14 00 ; ................
00000180h: 00 00 02 00 15 ; .....
各Classファイルの最初の4バイトは魔数となり、その唯一の役割はこのファイルが仮想マシンに受け入れられるclassファイルであるかどうかを決定することであり、多くのファイル標準は魔数アイデンティティ識別を採用しており、拡張子ではなく魔数を使用するのは主に安全のためであり、ファイル拡張子が勝手に変更できるためである.
ははは、興味深いことに、classファイルの最初の4バイトは0 xCAFEBABE(コーヒーベイビー)です.
1行のClassファイルをueで開いた16進数の内容を分析しましょう.
CA FE BA BE 00 00 00 32
最初の4バイトはClass形式であり、5番目と6番目はセカンダリバージョン番号であり、プライマリバージョン番号の値は0 x 0032、すなわち10進数の50であり、このバージョン番号はjdk 1.6以上のバージョンの仮想マシンで実行可能なClassファイルであることを示している.
2、定数プール
定数プールはプライマリ・セカンダリ・バージョンの直後であり、定数プール内の定数の数は固定されていないため、定数プールのエントリには、定数プールカウント値を表すu 2タイプのデータ、すなわち2バイトのデータを配置する必要があります.定数プールに21個の定数があることを表す0 x 0016、すなわち10進数の22.
定数プールには主に2つの定数が格納されています.字面量と記号参照、字面量はjava言語レベルの定数概念に近いです.例えば、テキスト文字列、finalの定数値として生命されるなどです.記号参照はコンパイル原理の概念に属します.以下の3種類が含まれています.
(1)クラスとインタフェースのフルネーム
(2)フィールドの名前と記述子
(3)メソッドの名前と記述子
他の押し倒しは疲れず、詳しくは見ていませんが、要するに、16進数フォーマット文字は前述の表のデータに対応し、意味があり、最終的には元のjavaファイルに翻訳することができます.
二、仮想マシンクラスのロードメカニズム
仮想マシンはクラスを記述するデータをClassファイルからメモリにロードし、データを検証、変換解析、初期化し、最終的に仮想マシンに直接使用できるjavaタイプを形成します.これが仮想マシンのクラスロードメカニズムです.
Java言語では、タイプのロードと接続プロセスはプログラムの実行中に完了します.これにより、クラスのロード時に少しオーバーヘッドが増加しますが、javaアプリケーションに高度な柔軟性を提供します.javaで生まれつき動的に拡張できる言語特性は、実行期間の動的ロードと動的接続という特徴によって実現されます.
クラスは、仮想マシンメモリにロードされてから始まり、メモリがアンインストールされるまでのライフサイクル全体に、ロード、検証、準備、解析、初期化、使用、アンインストールの7段階が含まれます.検証の準備と解析を総称して接続と呼びます.
初期化フェーズでは、仮想マシンがこの4つのみを規定している場合、クラスを初期化する必要があります(ロード、検証、準備は自然にその前に開始する必要があります)
(1)new,getstatic,putstaticまたはinvokestaticの4つの命令コードに遭遇し,この4つの命令コードを生成する最も一般的なjavaコードシーンは,newキーワードを用いてオブジェクトをインスタンス化し,クラスの静的フィールド(final修飾され,コンパイル期間中に結果を定数プールの静的フィールドに入れた場合を除く)を読み取り,設定し,クラスの静的メソッドを呼び出す場合である.
(2)java.lang.reflectパケットのメソッドを用いてクラスを反射呼び出した場合
(3)1つのクラスを初期化する場合,親がまだ初期化されていないことが判明した場合は,まずその親の初期化を開始する必要がある.
(4)仮想マシンが起動すると,ユーザはmain()メソッドのクラスを含む実行するプライマリクラスを指定する必要があり,仮想機会はまずこのプライマリクラスを初期化する.