程序計數器:(線程私有)當前線程所執行的字節碼的行號指示器,經過改變這個計數器的值來選取下一條須要執行的字節碼的指令,以程序中分支、循環和跳轉等流程的控制都離不開這個計數器的指示。java
虛擬機棧:(線程私有),每一個方法在執行時都會建立一個棧楨,用於存儲局部變量表、操做數棧、動態連接和方法出口等信息。一個方法從調用到執行完成的過程,對應的棧楨在虛擬機棧的進出過程。當線程結束時,虛擬機棧中的數據會被自動的釋放。數組
局部變量表:基本數據類型、對象的引用、返回地址,局部變量表鎖須要的內存空間是在程序編譯時就已經會被肯定好的。線程
本地方法棧:(線程私有)虛擬機棧是爲執行java方法所服務的,而本地方法棧是爲了虛擬機使用到的本地方法鎖服務的。對象
堆區:(線程共享)java堆是被全部的線程所共享的一片區域,全部的對象的實例和數組都會在堆區盡心分配。java堆細分:新生代和老年代;也可能會劃分出多個線程鎖共享額分配緩衝區TLAB;生命週期
Java堆能夠在物理上不連續的內存空間中,只要邏輯上連續就能夠。內存
方法區:(線程共享)存儲已經被虛擬機加載過的類的信息、常量、靜態變量和及時編譯器編譯後的代碼。在方法區中一個區域叫作:運行時常量池,用於存放編譯後生成的字面量和符號的引用。編譯器
(1)年輕代:虛擬機
全部新生成的對象首先都是放在年輕代的。年輕代的目標就是儘量快速的收集掉那些生命週期短的對象。年輕代分三個區。一個Eden區,兩個Survivor區(通常而言)。
大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被複制到Survivor區(兩個中的一個),當一個Survivor區滿時,此區的存活對象將被複制到另一個Survivor區,當另外一個Survivor區也滿了的時候,從前一個Survivor區複製過來的而且此時還存活的對象,將被複制「年老區(Tenured)」。編譯
(2)年老代:變量
在年輕代中經歷了N(可配置)次垃圾回收後仍然存活的對象,就會被放到年老代中。所以,能夠認爲年老代中存放的都是一些生命週期較長的對象。
(3)持久代:
用於存放靜態數據,如 Java Class, Method 等。持久代對垃圾回收沒有顯著影響。