Java 進階(一) JVM運行時內存模型

1.JVM運行時數據區域的劃分

a.程序計數器(Program Counter Register)

一塊較小的內存空間,能夠看做是當前線程所執行的字節碼的行號指示器。每一個線程擁有獨立的一個計數器,若是當前執行的是Native方法,則計數器值爲空。 數組

b.JVM棧(Java Virtual Machine Stack)

描述Java方法執行的內存模型,每一個方法在執行的同時都會建立一個棧幀(Stacks Frame)用於存儲局部變量表,操做數棧,動態連接,方法出口等信息。 函數

每個方法從調用直至執行完成的過程,就對應一個棧幀在JVM棧中入棧到出棧的過程。 spa

c.本地方法棧(Native Method Stack)

與JVM棧發揮的做用很是類似,區別不過是JVM棧爲JVM執行Java方法服務,而本地方法棧爲JVM使用到的Native方法服務。 線程

d.Java堆(Java Heap)

Java堆是被全部線程共享的一塊內存區域,在JVM啓動時建立。全部的對象實例以及數組都要在這裏分配內存,可是隨着JIT編譯器的發展,漸漸變得不是那麼絕對了。 對象

e.方法區(Method Area)

存儲已被JVM加載的類信息,常量,靜態變量,即時編譯器編譯後的代碼等數據。 接口

雖然JVM規範把方法區描述爲堆的一個邏輯部分,但它卻有一個別名叫作Non-Heap。 內存

f.運行時常量池(Runtime Constant Pool)

方法區的一部分。Class文件中除了有類的版本,字段,方法,接口等描述信息外,還有一項是常量池,用於存放編譯器生成的各類字面量和符號引用。 編譯器

g.直接內存(Direct Memory)

不是JVM運行時數據區的一部分,也不是JVM規範中定義的內存區域。 編譯

例如:JDK1.4中新引入的NIO(New Input/Output)類,一種基於通道與緩衝區的I/O方式,能夠使用Native函數庫直接操做堆外內存,而後經過存儲在Java堆中的DirectByteBuffer對象做爲這塊內存的引用,避免了在Java堆和Native堆中來回複製數據。 變量

相關文章
相關標籤/搜索