1. 程式人生 > 其它 >jvm虛擬機器記憶體

jvm虛擬機器記憶體


下面有關JVM記憶體,說法錯誤的是?
  • 程式計數器是一個比較小的記憶體區域,用於指示當前執行緒所執行的位元組碼執行到了第幾行,是執行緒隔離的
  • 虛擬機器棧描述的是Java方法執行的記憶體模型,用於儲存區域性變數,運算元棧,動態連結,方法出口等資訊,是執行緒隔離的
  • 方法區用於儲存JVM載入的類資訊、常量、靜態變數、以及編譯器編譯後的程式碼等資料,是執行緒隔離的
  • 原則上講,所有的物件都在堆區上分配記憶體,是執行緒之間共享的

答案:c

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