1. 程式人生 > >關於JVM記憶體(執行緒共享與非執行緒共享)

關於JVM記憶體(執行緒共享與非執行緒共享)

大多數 JVM 將記憶體區域劃分為 Method Area(Non-Heap)(方法區) ,Heap(堆) , Program Counter Register(程式計數器) , VM Stack(虛擬機器棧,也有翻譯成JAVA 方法棧的),Native Method Stack ( 本地方法棧 ),其中Method Area 和 Heap 是執行緒共享的 ,VM Stack,Native Method Stack 和Program Counter Register 是非執行緒共享的。為什麼分為 執行緒共享和非執行緒共享的呢?請繼續往下看。

首先我們熟悉一下一個一般性的 Java 程式的工作過程。一個 Java 源程式檔案,會被編譯為位元組碼檔案(以 class 為副檔名),每個java程式都需要執行在自己的JVM上,然後告知 JVM 程式的執行入口,再被 JVM 通過位元組碼直譯器載入執行。那麼程式開始執行後,都是如何涉及到各記憶體區域的呢?

概括地說來,JVM初始執行的時候都會分配好 Method Area(方法區) 和Heap(堆) ,而JVM 每遇到一個執行緒,就為其分配一個 Program Counter Register(程式計數器) , VM Stack(虛擬機器棧)和Native Method Stack (本地方法棧), 當執行緒終止時,三者(虛擬機器棧,本地方法棧和程式計數器)所佔用的記憶體空間也會被釋放掉。這也是為什麼我把記憶體區域分為執行緒共享和非執行緒共享的原因,非執行緒共享的那三個區域的生命週期與所屬執行緒相同,而執行緒共享的區域與JAVA程式執行的生命週期相同,所以這也是系統垃圾回收的場所只發生線上程共享的區域(實際上對大部分虛擬機器來說知發生在Heap上)的原因。