jvm虛擬機原理1
二、JVM的內存管理和垃圾回收
JVM中的內存管理主要是指JVM對於Heap的管理,這是因為Stack,PC Register和Native Method Stack都是和線程一樣的生命周期,在線程結束時自然可以被再次使用。雖然說,Stack的管理不是重點,但是也不是完全不講究的。1.棧的管理
JVM允許棧的大小是固定的或者是動態變化的。在Oracle的關於參數設置的官方文檔中有關於Stack的設置(http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html#wp1024112),是通過-Xss來設置其大小。關於Stack的默認大小對於不同機器有不同的大小,並且不同廠商或者版本號的jvm的實現其大小也不同,如下表是HotSpot的默認大小:Platform | Default |
---|---|
Windows IA32 | 64 KB |
Linux IA32 | 128 KB |
Windows x86_64 | 128 KB |
Linux x86_64 | 256 KB |
Windows IA64 | 320 KB |
Linux IA64 | 1024 KB (1 MB) |
Solaris Sparc | 512 KB |
關於棧一般會發生以下兩種異常: 1.當線程中的計算所需要的棧超過所允許大小時,會拋出StackOverflowError。 2.當Java棧試圖擴展時,沒有足夠的存儲器來實現擴展,JVM會報OutOfMemoryError。 我針對棧進行了實驗,由於遞歸的調用可以致使棧的引用增加,導致溢出,所以設計代碼如下:
byte | 值是8位的有符號二進制補碼整數 |
short | 值是16位的有符號二進制補碼整數 |
int | 值是32位的有符號二進制補碼整數 |
long | 值是64位的有符號二進制補碼整數 |
char | 值是表示Unicode字符的16位無符號整數 |
float | 值是32位IEEE754浮點數 |
double | 值是64位IEEE754浮點數 |
magic:
魔數,魔數的唯一作用是確定這個文件是否為一個能被虛擬機所接受的Class文件。魔數值固定為0xCAFEBABE,不會改變。
minor_version、major_version:
分別為Class文件的副版本和主版本。它們共同構成了Class文件的格式版本號。不同版本的虛擬機實現支持的Class文件版本號也相應不同,高版本號的虛擬機可以支持低版本的Class文件,反之則不成立。
constant_pool_count:
常量池計數器,constant_pool_count的值等於constant_pool表中的成員數加1。
constant_pool[]:
常量池,constant_pool是一種表結構,它包含Class文件結構及其子結構中引用的所有字符串常量、類或接口名、字段名和其它常量。常量池不同於其他,索引從1開始到constant_pool_count -1。
access_flags:
訪問標誌,access_flags是一種掩碼標誌,用於表示某個類或者接口的訪問權限及基礎屬性。access_flags的取值範圍和相應含義見下表:
this_class:
類索引,this_class的值必須是對constant_pool表中項目的一個有效索引值。constant_pool表在這個索引處的項必須為CONSTANT_Class_info類型常量,表示這個Class文件所定義的類或接口。
super_class:
父類索引,對於類來說,super_class的值必須為0或者是對constant_pool表中項目的一個有效索引值。如果它的值不為0,那constant_pool表在這個索引處的項必須為CONSTANT_Class_info類型常量,表示這個Class文件所定義的類的直接父類。當然,如果某個類super_class的值是0,那麽它必定是Java.lang.Object類,因為只有它是沒有父類的。
interfaces_count:
接口計數器,interfaces_count的值表示當前類或接口的直接父接口數量。
interfaces[]:
接口表,interfaces[]數組中的每個成員的值必須是一個對constant_pool表中項目的一個有效索引值,它的長度為interfaces_count。每個成員interfaces[i] 必須為CONSTANT_Class_info類型常量。
fields_count:
字段計數器,fields_count的值表示當前Class文件fields[]數組的成員個數。
fields[]:
字段表,fields[]數組中的每個成員都必須是一個fields_info結構的數據項,用於表示當前類或接口中某個字段的完整描述。
methods_count:
方法計數器,methods_count的值表示當前Class文件methods[]數組的成員個數。
methods[]:
方法表,methods[]數組中的每個成員都必須是一個method_info結構的數據項,用於表示當前類或接口中某個方法的完整描述。
attributes_count:
屬性計數器,attributes_count的值表示當前Class文件attributes表的成員個數。
attributes[]:
屬性表,attributes表的每個項的值必須是attribute_info結構。
四、一個java類的實例分析 為了了解JVM的數據類型規範和內存分配的大體情況,我新建了MemeryTest.java:jvm虛擬機原理1