JVM學習筆記(1)

    Java虛擬機在執行Java程序的過程當中會把它所管理的內存劃分爲若干個不一樣的數據區域。程序員

    

    下面介紹下內存中各個數據區:算法

    PC寄存器/程序計數器(線程私有):數組

        程序計數器是一塊較小的內存空間,它能夠看做是當前線程所執行的字節碼的行號指示器線程

    JAVA虛擬機棧(線程私有):對象

        生命週期與線程相同,即建立線程的同時建立的,用於存放棧幀。棧幀是一個方法在執行的時候存儲局部變量表、操做數棧、操做數棧,動態連接、方法出口燈信息。每一個方法調用完後會將應的棧幀從JAVA虛擬機棧中出棧。若是線程請求的棧深度大於虛擬機的棧深度,會拋出SatckOverflowError異常生命週期

    本地方法棧(線程私有):內存

  本地方法棧(Native Method Stack)與虛擬機棧所發揮的做用是很是類似的,它們之間的區別不過是虛擬機棧爲虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則爲虛擬機使用到的Native方法服務。編譯器

 JAVA堆(線程共享):虛擬機

  全部的對象實例以及數組都要在堆上分配,是垃圾收集器管理的主要區域。這塊是咱們主要關注的模塊,以後一些GC算法和GC處理器都是針對這塊的內存管理

 方法區(線程共享):

  它用於存儲已被虛擬機加載的類信息、 常量、 靜態變量、 即時編譯器編譯後的代碼等數據。其中運行時常量池是方法區的一部分。

 上面JAVA堆和方法區是線程共享的,其實只要理解JAVA堆和方法區存放什麼就很好理解了爲何這兩個是共享的部分。對於線程獨有的這部份內存,都是隨着線程的啓動而建立,而當線程被銷燬時,內存也就隨之釋放。這一部份內存,不須要垃圾蒐集器的管理,而是JAVA虛擬機來主動管理,每當一個線程被建立的時候,JAVA虛擬機就會爲其分配相應的PC寄存器和JAVA虛擬機棧,若是須要的話,還會有本地方法棧。相應的,當一個線程被銷燬的時候,JAVA虛擬機也會將這個線程所佔有的內存所有釋放。相對於線程獨有的那部份內存,全局共享的這部份內存更加難以處理,不過這只是針對於虛擬機的實現來講,由於這一部份內存是要實現自動內存管理系統(GC)的。全局共享的這部份內存(如下簡稱堆),內存分配主要是由程序員顯示的使用new關鍵字來觸發的,至於new出來的這部份內存在哪分配,如何分配,則是JAVA虛擬機來決定。而這部份內存的釋放,則是由自動內存管理系統(如下簡稱GC)來管理的

相關文章
相關標籤/搜索