線程私有,當前線程字節碼文件執行的行數java
線程私有,生命週期和線程相同,描述的是java方法執行的內存模型:每一個方法執行時都會建立一個棧幀,用戶存儲局部變量、操做數棧、動態連接、方法出口等信息。每一個方法的執行到執行完成,對應着一個棧幀從入棧到出棧的過程。若是線程請求的棧的深度大於虛擬機所容許的深度,將拋出SOF,stackOverflowError,若是棧擴展是沒法申請到足夠的空間,拋出OOM併發
同虛擬機棧,不過它是爲Native方法服務。jvm
線程共享,java堆的惟一目的是存儲實例對象,GC的主要是這部份內存,還能夠細分新生代、老年代,固然還能再細分,不過無論怎麼細分,存儲的依然是對象實例。若是堆沒有內存完成實例分配,而且堆也沒法擴展時,會跑出OOM異常;線程
線程共享,主要存儲已被加載的類信息、靜態變量、常亮、及時編譯後的代碼等。也會拋出OOM。指針
方法區的一部分,Class文件中除了有類的字段、方法、接口、版本等描述信息外,還有常量池,用於存放編譯期生成的各類字面量的和符號引用,這部分信息將在類加載完成後進入運行時常量池。對象
1.首先檢查 這個執行的參數可否在常量池中定位到一個類的符號引用,並檢查這個符號引用表明的類是否已被加載、驗證、初始化,若是沒有,則須要先加載類; 2.類加載完成以後,開始進行內存分配,須要分配的內存,在類加載以後就已經肯定了,包括指針碰撞和空閒列表兩種方法,主要是根據內存是否連續,分配內存的過程當中可能遇到併發問題,jvm是經過cas操做保證原子性; 3.類加載完成後,會對類進行初始化爲0,不包括對象頭,這保證了對象實例字段在java中不須要初始化就能使用。 4.接下來要對對象進行設置,例如:這個對象是哪一個類的實例、若是找到類的元數據信息、對象的哈希碼、對象的GC分代年齡接口
對象包含:對象頭、實例數據、對齊填充8字節倍數生命週期
java程序須要經過java棧本地變量表中的reference數據來操做堆上的具體對象。目前主流的訪問方式有句柄和直接指針; 句柄:java堆中分配一塊內存做爲句柄池,reference中存放的就是對象的句柄地址,句柄中包含了對象的實例數據與數據類型的引用。內存
直接指針:reference中存放的就是對象的地址,經過對象頭中的類型指針,到方法區中找到對象類型數據。虛擬機