JVM總結_JVM內存結構

1. JVM內存結構html

  •  堆(Heap)java

  •  方法區(Method Area)git

  •  程序計數器(Program Counter Register)github

  •  本地方法棧(Native Method Stack)算法

  •  虛擬機棧(VM Stack)數組

    

JVM內存結構多線程

 

 

  •  堆(Heap)線程

堆是Java虛擬機中內存最大的一塊區域,堆是被全部線程共享的一塊區域。全部的對象實例及數組都要在堆上分配(可是對着JIT編譯器的發展和逃逸分析算法的成熟,全部的對象實例及數組都在堆上分配這一點並非那麼絕對,關於這裏的更多描述請看這裏http://www.hollischuang.com/archives/2398)。指針

java堆中分爲新生代和老年代。新生代中能夠再細分爲:伊甸園(Eden)、倖存1區(From Survivor)、倖存2區(To Survivor)。htm

 

JVM新生代結構

 

 

java堆在物理上不要求必定是連續的內存空間,只要邏輯上連續便可。既能夠固定大小,也能夠拓展。(經過-Xmx和-Xms控制)

  • 方法區(Method Area)

和堆(Heap)同樣,方法區也被全部的線程共享。用於存儲對象的類型信息,這些類型信息包括:虛擬機已經加載的類的信息、常量、靜態變量。

方法區中還有一部分區域是運行時常量池(Runtime Costant Pool),用於存放編譯期生成的各類字面量和符號引用,這些內容在完成類的加載後進入運行事常量池存放。可是常量並非必定在編譯期才能放入常量池中,在運行期產生的常量也能夠放入常量池中,好比使用String的intern()方法(更多請見:https://mritd.me/2016/03/22/Java-%E5%86%85%E5%AD%98%E4%B9%8B%E6%96%B9%E6%B3%95%E5%8C%BA%E5%92%8C%E8%BF%90%E8%A1%8C%E6%97%B6%E5%B8%B8%E9%87%8F%E6%B1%A0/)。

JVM方法區結構

  • 程序計數器(Program Counter Register)

    程序計數器在JVM的空間較小,並且它是線程私有的。它能夠看作是當前線程所執行的字節碼行號指令器。正由於有了程序計數器,在多線程進行線程切換時,線程可以記住執行到了哪裏。程序計數器也是JVM中惟一沒有規定(不會拋出)OutOfMemoryError的狀況的區域。

 

  • 虛擬機棧(VM Stack)

    虛擬機棧在JVM中也是線程私有的,它的生命週期與線程相同。每一個方法執行的時候會建立一個棧幀(Stack Frame),用於存儲局部變量表(Local Variable Table),操做數棧(Operand Stack),動態鏈接(Dynamic Linking),方法出口等信息。每一個方法從開始調用到執行完成的過,就是對應的棧幀從入棧到出棧的過程。(更多可見https://iamjohnnyzhuang.github.io/java/2016/07/12/Java%E5%A0%86%E5%92%8C%E6%A0%88%E7%9C%8B%E8%BF%99%E7%AF%87%E5%B0%B1%E5%A4%9F.html)

    其中,局部變量表中存放了基本數據類型,和引用類型的對象指針和一套字節碼指令的地址。其中long和double會佔用兩個局部變量的空間。局部變量的空間在編譯期就完成了分配,並切不會在運行期間發生改變。

    虛擬機棧可能會發生一下兩種異常:

        1. StackOverflowError:線程請求的棧深度大於虛擬機所容許的深度。

        2. OutMermoryError:棧擴展是沒法再申請到內存。    

  • 本地方法棧(Native Method Stack)

    本地方法棧與虛擬機棧很是的類似,本地方法棧爲虛擬機使用的Native方法服務。本地方法棧能夠存放別的語言的方法。

  • 直接內存(Direct Memory)

    直接內存並非JVM內存中的一部分,可是這一部分也會致使OutOfMemoryError異常.

後續繼續完善

相關文章
相關標籤/搜索