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上)的原因。


總體來說JVM運行時,數據區包含:虛擬機棧,堆,方法區,本地方法棧,程序計數器,其中,堆和方法區是線程共享的,虛擬機棧和程序計數器是線程私有的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章