Java虛擬機內存模型-運行時數據區域劃分

Java與C++之間有一堵由內存動態分配和垃圾收集技術所圍成的高牆,牆外面的人想進去,牆裏面的人卻想出來。 -《深刻理解java虛擬機》java

對於牆外邊的Java而言,Java虛擬機內存模型的劃分,若是依據線程是否能夠共享,基本能夠分爲兩大類:其1、線程共享區域,其2、線程非共享區域。即,方法區、虛擬機棧、本地方法棧、程序計數器、Java堆,其中在方法區中還有一個常量區。以下圖:線程

引用楊俊明老師分享(圖1)

下面對各個區域作簡要描述:3d

一、程序計數器(Program counter register)cdn

是一塊較小的內存空間,屬於非線程共享,」線程私有「內存,它的做用能夠看作是當前線程所執行的字節碼的行號指示器。對象

字節碼解釋器工做時就是經過改變這個計數器的值來選取下一條須要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都須要依賴這個計數器來完成。blog

二、java虛擬機棧生命週期

Java虛擬機棧(Java Virtual Machine Stacks)也是線程私有的,它的生命週期與線程相同。虛擬機棧描述的是Java方法執行的內存模型:每一個方法被執行的時候都會同時建立一個棧幀(Stack Frame)用於存儲局部變量表、操做棧、動態連接、方法出口等信息。每個方法被調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。內存

三、本地方法棧字符串

本地方法棧(Native Method Stacks)與虛擬機棧所發揮的做用是很是類似的,屬於」線程私有「,其區別不過是虛擬機棧爲虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則是爲虛擬機使用到的Native方法服務。虛擬機

四、堆(java heap)

對於大多數應用來講,Java堆(Java Heap)是Java虛擬機所管理的內存中最大的一塊。Java堆是被全部線程共享的一塊內存區域,在虛擬機啓動時建立。此內存區域的惟一目的就是存放對象實例,幾乎全部的對象實例都在這裏分配內存。

堆的話也是GC回收主要關注的內存區域,這裏就不展開了。

五、方法區(method area)

方法區中主要存放類解構、類成員定義、static靜態成員等,屬於線程共享,其中在方法區中還有劃分出一部分叫作運行時常量池(runtime constant pool),好比:字符串,int -128~127範圍的值。

對於java內存模型或者說java虛擬機運行時候內存區域劃分,作了大體的概念上的介紹。分類主要是依據線程是否可共享來劃分。「線程私有」:程序計數器、虛擬機棧,本地方法棧;「線程共享」:java堆、方法區(包含運行時常量池)。

相關文章
相關標籤/搜索