運行時數據區中包含哪些區域?哪些線程共享?哪些線程獨享?
運行時數據區中包含哪些區域?哪些線程共享?哪些線程獨享?【?????】
Java 虛擬機在執行 Java 程序的過程中會把它管理的內存劃分成若干個不同的數據區域。
JDK 1.8 和之前的版本略有不同,下面會介紹到。
區別就是 1.8有一個元數據區替代方法區了。
那么,Java 8 中 PermGen 為什么被移出 HotSpot JVM 了?我總結了兩個主要原因(詳見:JEP 122: Remove the Permanent Generation):
由于 PermGen 內存經常會溢出,引發惱人的 java.lang.OutOfMemoryError: PermGen,因此 JVM 的開發者希望這一塊內存可以更靈活地被管理,不要再經常出現這樣的 OOM
移除 PermGen 可以促進 HotSpot JVM 與 JRockit VM 的融合,因為 JRockit 沒有永久代。
根據上面的各種原因,PermGen 最終被移除,方法區移至 Metaspace,字符串常量移至 Java Heap。
程序計數器
程序計數器(Program Counter Register)是一塊較小的內存空間,由于JVM可以并發執行線程,因此會存在線程之間的切換,而這個時候就程序計數器會記錄下當前程序執行到的位置,以便在其他線程執行完畢后,恢復現場繼續執行。
JVM會為每個線程分配一個程序計數器,與線程的生命周期相同。
如果線程正在執行的是應該Java方法,這個計數器記錄的是正在執行虛擬機字節碼指令的地址。
如果正在執行的是Native方法,計數器的值則為空(undefined)
注意:程序計數器是唯一一個不會出現 OutOfMemoryError 的內存區域,它的生命周期隨著線程的創建而創建,隨著線程的結束而死亡。
本地方法棧
Java虛擬機棧是調用Java方法;本地方法棧是調用本地native方法,可以認為是通過 JNI (Java Native Interface) 直接調用本地 C/C++ 庫,不受JVM控制。
方法執行完畢后相應的棧幀也會出棧并釋放內存空間,也會出現 StackOverFlowError 和 OutOfMemoryError 兩種錯誤。
虛擬機棧
虛擬機棧 描述的是 Java 方法執行的內存模型:
每個方法在執行的同時都會創建一個棧幀(Stack Frame,是方法運行時的基礎數據結構)用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中入棧到出棧的過程。
虛擬機棧是每個線程獨有的,隨著線程的創建而存在,線程結束而死亡。
在虛擬機棧內存不夠的時候會OutOfMemoryError,在線程運行中需要更大的虛擬機棧時會出現StackOverFlowError。
Java 堆
Java 堆是被所有線程共享的一塊內存區域,在虛擬機啟動時創建。此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存。
堆是垃圾收集器管理的主要區域,又稱為“GC堆”,可以說是Java虛擬機管理的內存中最大的一塊。
現在的虛擬機(包括HotSpot VM)都是采用分代回收算法。在分代回收的思想中, 把堆分為:新生代+老年代+永久代(1.8沒有了); 新生代 又分為 Eden + From Survivor + To Survivor區。
方法區
方法區(Method Area)與 Java 堆一樣,是所有線程共享的內存區域。
方法區用于存儲已經被虛擬機加載的類信息(即加載類時需要加載的信息,包括版本、field、方法、接口等信息)、final常量、靜態變量、編譯器即時編譯的代碼等。
方法區邏輯上屬于堆的一部分,但是為了與堆進行區分,通常又叫“非堆”。
方法區比較重要的一部分是運行時常量池(Runtime Constant Pool),為什么叫運行時常量池呢?是因為運行期間可能會把新的常量放入池中,比如說常見的String的intern()方法。
元空間
1.8就把方法區改用元空間了。類的元信息被存儲在元空間中。元空間沒有使用堆內存,而是與堆不相連的本地內存區域。所以,理論上系統可以使用的內存有多大,元空間就有多大,所以不會出現永久代存在時的內存溢出問題。
可以通過 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 來指定元空間的大小。
Java JVM
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。