1.方法區(Method Area) 存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據java
2.堆(Heap) 存放對象實例,幾乎全部對象實例都在這裏分配內存數組
3.虛擬機棧(VM Stack) 描述的是Java方法執行的內存模型:每一個方法在執行的同時會建立一個Stack Frame(方法運行時的基礎數據結構)用於存儲局部變量表、操做數棧、動態鏈接、方法出口等信息緩存
4.本地方法棧(Native Method Stack) 與虛擬機棧了相似,不過則爲虛擬機使用的到的Native方法服務。(有的虛擬機譬如Sun HotSpot虛擬機直接把本地方法棧和虛擬機棧合二爲一)數據結構
5.程序計數器(Program Counter Register) 可看做當前線程所執行的字節碼的行號的標識器jvm
一、stack segment
二、heap segment
三、code segment
四、data segment)
當咱們在程序中聲明一個局部變量的時候,此變量就存放在了 stack segment(棧)當中;優化
當new 一個對象的時候,此對象放在了heap segment(堆)當中;線程
static 的變量或者字符串常量 則存在在 data segment(數據區)中;code
類中方法是存在在 code segment(代碼區)中。對象
棧stack內存
堆heap
方法區method area( 位於堆中)
運行時數據區包括:虛擬機棧區,堆區,方法區,本地方法棧,程序計數器
虛擬機棧區 :也就是咱們常說的棧區,線程私有,存放基本類型,對象的引用和 returnAddress ,在編譯期間完成分配。
堆區 , JAVA 堆,也稱 GC 堆,全部線程共享,存放對象的實例和數組, JAVA 堆是垃圾收集器管理的主要區域。
方法區 :全部線程共享,存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯後的代碼等數據。這個區域的內存回收目標主要是針對常量池的對象的回收和對類型的卸載。
程序計數器 :線程私有,每一個線程都有本身獨立的程序計數器,用來指示下一條指令的地址。
Java線程之間的通訊由Java內存模型(簡稱爲JMM)控制,JMM決定一個線程對共享變量的寫入什麼時候對另外一個線程可見。
一、String str1 = 「abc」,「abc」分配在內存字符常量區;
二、程序計數器是一個比較小的內存區域,用於指示當前線程所執行的字節碼執行到了第幾行,是線程隔離的;
三、虛擬機棧描述的是Java方法執行的內存模型,用於存儲局部變量,操做數棧,動態連接,方法出口等信息,是線程隔離的;
四、原則上講,全部的對象都在堆區上分配內存,是線程之間共享的