1. 程式人生 > >jvm運行時內存劃分

jvm運行時內存劃分

hot java開發 初始化 類的編譯 ots 過程 繼續 數據類型 當前

(根據《深入理解java虛擬機》這本書總結)   

本文主要解釋jvm內存模型,以及各個部分的作用。都是自己總結的給自己看的通俗語言,未用專業術語的見諒。 

 一、為什麽要了解jvm內存模型?

  在了解一個類的編譯-加載-內存分配-初始化所有過程前,要先了解jvm的內存模型。這樣對整個java體系可能會更加便於理解。當然,如果不理解這些,也是沒關系的,照樣可以進行java開發。

二、jvm內存模型

  1、根據自己的理解舉個最簡單的例子,一個main方法啟動,進程運行,在這個過程中,會調用方法、開啟多個線程、有局部變量、成員變量、靜態變量、有基本對象、有引用對象、可能還包含鎖等概念。這些內容在jvm虛擬機中是怎麽存儲的呢?下面就是jvm運行時的最簡單的內存劃分介紹。

  2、jvm運行時,內存主要有五個部分,具體的作用及劃分如下:

    按線程是否共享劃分:

    線程共享的區域有

     (1)堆內存:堆內存最大的作用是存儲對象實例,通俗的理解,當我們new一個對象的時候,引用所指向的內容就存在堆中,也存儲類基本類型成員變量。

     (2)方法區:當類編譯階段,將編譯的字節碼文件、類信息、靜態變量,並且常量池也在方法區中(常量池)。

    線程私有的區域有:

     (3)棧內存:棧的生命周期跟線程的生命周期是一樣的,當調用一個方法的時候,就會有一個方法入棧,虛擬機會為這個方法創建一個棧幀,棧幀中存儲著局 部變量表等信息(局部變量的大小在類加載的時候就能確定,所以棧幀中局部便量表占用的大小是固定的),另外棧中存儲著局部基本類型變 量、類涉及的所有對象的引用(可能指向堆也可能指向方法去)

     (4)本地方法棧:本地方法棧和棧相似,區別是本地方法棧是用來執行類需要的native方法的。

     (5)程序計數器:當前線程所執行的字節碼行號指示器。

  3、根據一個類總結相關的存儲位置:

    類信息、方法等字節碼:方法區

    基本類型成員變量:堆(易混)

    引用類型成員變量:堆

    引用類型成員變量引用地址:棧

    基本類型局部變量:棧

    引用類型局部變量:堆

    引用類型局部變量引用地址:棧

    基本數據類型靜態變量:方法區

    引用數據類型靜態變量:方法區

三、new對象的整個過程(針對hotspot虛擬機)

   當調用new方法時,對於程序語言,只是一行代碼,一個對象實例就產生了,但是對於虛擬機來說,過程如下:

    1、檢查new的類在方法區中的類信息是否存在,如果存在,檢查該類是否被虛擬機加載過,如果沒有加載過,需要先加載類信息

    2、進行內存分配,在堆中對實例對象進行內存地址分配。

    3、將實例分配到的內存空間初始化為零值。

    4、對實例進行必要的信息設置,如實例的哈西值、實例數據哪個類new出來的等

   上面的四部對於虛擬機來說,對象實例就是創建好了。程序語言則需要對類繼續進行初始化,比如有些對象有顯式初始值等等

    

  

jvm運行時內存劃分