整數類型與整形值編程
byte 的取值範圍:-128~127(-2的7次方到2的7次方-1)數組
short 的取值範圍:-32768~32767(-2的15次方到2的15次方-1)安全
int 的取值範圍:-2147483648~2147483647(-2的31次方到2的31次方-1)數據結構
long 的取值範圍:-9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)多線程
char的取值範圍:0~65535(包括0和65535)jvm
浮點型編程語言
float 和 double 都是表示浮點型的數據類型,它們之間的區別在於精確度的不一樣。ide
float(單精度浮點型)取值範圍:3.402823e+38~1.401298e-45(e+38 表示乘以10的38次方,而e-45 表示乘以10的負45次方)函數
double(雙精度浮點型)取值範圍:1.797693e+308~4.9000000e-324(同上)
returnAddress類型是指向某個操做碼(opcode)的指針,此操做碼與Java虛擬機指令相對應。
Java虛擬機中沒有提供boolean值專用的字節碼指令,Java語言表達式所操做的boolean值,在編譯以後都使用Java虛擬機中的int數據類型來代替,true值採用1來表示,false值採用0來表示。
Java虛擬機中有三種引用類型:類類型(class type)、數組類型(array type)和接口類型(interface type),這些引用類型的值分別指向動態建立的類實例,數組實例和實現了某個接口的類實例或數組實例。
Java虛擬機規範並無規定null在虛擬機實現中應當怎樣用編碼來表示。
The Java Virtual Machine defines various run-time data areas that are used during execution of a program. Some of these data areas are created on Java Virtual Machine start-up and are destroyed only when the Java Virtual Machine exits. Other data areas are per thread. Per-thread data areas are created when a thread is created and destroyed when the thread exits.
運行時數據區 | 線程私有 | 分配方式 | 異常 | Jvm參數 |
---|---|---|---|---|
PC寄存器 | true | 線程啓動時建立 | -- | |
Java棧 | true | 和線程同時建立 | StackOverflowError/OOM | -Xss表示的是Java虛擬機棧的大小 |
Java堆 | false | JVM啓動時建立 | OOM | -Xms是 -XX:InitialHeapSize的簡寫 表示的是初始化堆的大小 -Xmx 是 -XX:MaxHeapSize的簡寫 表示的是設置堆的最大大小 |
運行時常量池 | false | 加載類後接口到虛擬機 | OOM | |
方法區 | false | JVM啓動時建立 | OOM | |
本地方法棧 | true | 線程建立的時候 | StackOverflowError |
線程私有
,線程啓動時建立
,存儲下一條要執行的指令的地址
The Java Virtual Machine can support many threads of execution at once . Each Java Virtual Machine thread has its own pc (program counter) register.At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method for that thread. If that method is not native, the pc register contains the address of the Java Virtual Machine instruction currently being executed. If the method currently being executed by the thread is native, the value of the Java Virtual Machine's pc register is undefined. The Java Virtual Machine's pc register is wide enough to hold a returnAddress or a native pointer on the specific platform.
任意時刻,線程只能執行一個方法,即當前方法,若是線程當前執行的是本地方法,寄存器的值是undefined,不然,pc寄存器包含當前正在執行的Java虛擬機指令的地址,pc寄存器的容量至少應該能保存一個returnAddress類型的數據或者一個與平臺相關的本地指針的值。
線程私有
,和線程同時建立
Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread. A Java Virtual Machine stack stores frames (存儲棧幀),frames may be heap allocated. The memory
for a Java Virtual Machine stack does not need to be contiguous.棧幀能夠在堆中分配,Java虛擬機棧使用的內存不須要是連續的
Java虛擬機棧可能發生以下異常:
- 若是線程請求分配的棧容量超過Java虛擬機棧容許的最大容量,Java虛擬機將會拋出一個StackOverflowError異常
- 若是Java虛擬機棧能夠動態擴展,在擴展(-Xss)的時候沒法申請到足夠的內存,或者在建立新的內存時沒有足夠的內存去建立對應的Java虛擬機棧,Java虛擬機將會拋出一個OutOfMemoryError異常。
線程共享
,JVM啓動時建立
The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated
堆是可供各個線程共享的運行時內存區域,也是供全部類實例和數組對象分配內存的區域,-Xmx指令和-Xms可限制其大小。
Java堆可能出現的異常:
- 實際所需的堆超過了自動內存管理系統能提供的最大容量,那Java虛擬機將會拋出一個OutOfMemoryError異常。
線程共享
,JVM啓動時建立
,堆的邏輯組成部分(可不實現垃圾收集)
,在內存中能夠不連續
方法區存儲了每個類的結構信息,如運行時常量池、字段和方法數據、構造函數和普通方法的字節碼內容,以及一些在類、實例、接口初始化時用到的特殊方法。
可能發生的異常:
方法區的內存空間不能知足內存分配請求時,Java虛擬機將拋出一個OutOfMemoryError異常。
在方法區分配
A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool table in a class file. It contains several kinds of constants, ranging from numeric literals known at compile-time to method and field references that must be resolved at run-time.
運行時常量池是class文件中每一個類或接口的常量池表constant_pool table的運行時表示形式,它包括了從編譯期可知的數值字面量到必須在運行期解析後才能得到的方法或字段引用。每個運行時常量池都在Java虛擬機的方法區中分配,在加載類和接口到虛擬機後,就建立對應的運行時常量池。
可能的異常:
- 當建立類或接口時,若是構造運行時常量池所需的內存空間超過了方法區能提供的最大值,那麼Java虛擬機將會拋出一個OutOfMemoryError異常。
按線程分配
Java虛擬機實現可能會使用到傳統的棧(C stack)來支持native方法(使用Java之外的其餘語言編寫的方法)的執行,這個棧就是本地方法棧。Java虛擬機若是不支持native方法,或自己不依賴傳統棧,就能夠不提供本地方法棧,若是支持本地方法棧,那這個棧通常會在線程建立的時候按線程分配。
可能的異常:
- 線程請求分配的棧容量超過本地方法棧容許的最大容量,Java虛擬機拋出StackOverflowError異常
- 本地方法棧在擴展的時候,沒法申請到足夠的內存,或者建立新線程時沒有足夠內存去建立對應的本地方法棧,Java虛擬機拋出OutOfMemoryError異常
線程私有
,隨方法調用而建立,隨方法結束而銷燬
棧幀(frame)是用來存儲數據和部分過程結果的數據結構,同時也處理動態連接(dynamic linking)、方法返回值和異常分派(dispatch exception)。
棧幀的存儲空間由建立它的線程分配在Java虛擬機棧中,每一個棧幀都有本身的本地變量表(local variable),操做數棧(operand stack)和指向當前方法所屬的類的運行時常量池的引用。
本地變量表和操做數棧的容量在編譯期肯定,棧幀數據結構的大小僅僅取決於Java虛擬機的實現。
每一個棧幀內部包含一組稱爲局部變量表的變量列表。局部變量表的長度由編譯期決定,存儲於類或接口的二進制表示之中。
一個局部變量能夠保存一個類型爲 boolean, byte, char, short, int, float, reference, or returnAddress.的數據,兩個局部變量能夠保存一個類型爲long or double的數據。
Java虛擬機使用局部變量表來完成方法調用時的參數傳遞。當調用實例方法時,第0個局部變量必定用來存儲該實例方法所在對象的引用(this),後續的其餘參數將會傳遞至局部變量表中從1開始的連續位置上。
每一個棧幀內部包含一個成爲操做數棧的後進先出棧,它的深度由編譯期決定。一個long或者double類型的數據會佔用兩個單位的棧深度,其餘數據類型則會佔用一個單位的棧深度。
每一個棧幀內部都包含一個指向當前方法所在類型的運行時常量池的引用,以便對當前方法的代碼實現動態連接。在class文件裏,一個方法若要調用其餘方法,或者訪問成員變量,須要經過符號引用來表示,動態連接的做用就是將這些符號引用所表示的方法裝換爲對實際方法的直接引用。
JAVA編程語言中的構造器是以一個名爲
一個類或者接口最多能夠包含一個類或者接口的初始化方法,這個方法不包含參數,返回類型爲void,名
Java虛擬機的指令由一個字節長度的、表明着某種特定操做含義的操做碼(opcode)以及跟隨其後的零至多個表明此操做所需參數的操做數(operand)所構成。虛擬機中的不少指令並不包含操做數,只有一個操做碼。
編譯器會在編譯期或運行期將byte和short類型的數據帶符號擴展(sign-extend)爲相應的int類型數據,將boolean和char類型數據零位擴展(zero-extend)爲相應的int類型數據。在處理boolean、byte、short和char類型的數組時,也會轉換爲使用對應的int類型的字節碼指令來處理。所以,操做數的實際類型爲boolean、byte、char及short的大多數操做,均可以操做數的運算類型爲int的指令來完成。
實際類型 | 運算類型 | 類別 |
---|---|---|
boolean | int | 1 |
byte | int | 1 |
char | int | 1 |
short | int | 1 |
int | int | 1 |
float | float | 1 |
reference | reference | 1 |
returnAddress | returnAddress | 1 |
long | long | 2 |
double | double | 2 |
Reflection, such as the classes in the package java.lang.reflect and the class Class.
反射,例如在java.lang.reflect包中的各個類和Class類.
Loading and creation of a class or interface. The most obvious example is the
class ClassLoader.
加載和建立類或接口的類,好比ClassLoader
Linking and initialization of a class or interface. The example classes cited above
fall into this category as well.
鏈接和初始化類或接口的類,剛纔說的ClassLoader也屬於這樣的類
Security, such as the classes in the package java.security and other classes
such as SecurityManager.
安全,例如java.security包中的各個類和SecurityManager等其餘類。
Multithreading, such as the class Thread.
多線程,如Thread
Weak references, such as the classes in the package java.lang.ref
弱引用,如java.lang.ref包中的各個類
《Java虛擬機規範JavaSE8》第2章