JVM_1.1_執行時記憶體區域_堆
執行時記憶體區域這塊,如果不將記憶體各個區域做什麼的瞭解清楚,後面看的會很累。
之前將JVM執行時記憶體區域的內容,整理在了一篇文章中。
在後續深入、細緻的學習中,整理的內容越來越多,一篇的話,會導致篇幅過長。
所以將《JVM執行時記憶體區域詳解》分為以下幾個章節:
這裡將《Java虛擬機器規範中文版》上傳了,點選下面連結,即可下載
目錄
堆
《深入理解Java虛擬機器:JVM高階特性與最佳實踐》
Java堆是Java虛擬機器所管理的記憶體中最大的一塊。Java堆是執行緒共享的,在虛擬機器啟動時建立;
此記憶體區域的唯一目的就是存放物件例項,幾乎所有的物件例項都在這裡分配記憶體。
但隨著技術發展,所有物件都在堆上分配也漸漸變得不那麼"絕對"了;
Java堆是垃圾蒐集器管理的主要區域,因此很多時候也被稱作"GC堆"。
從記憶體回收的角度來看,由於目前垃圾收集器都採用分代收集演算法,所以 堆 還可以細分為:新生代 和 老年代。
不過無論如何劃分,都與存放內容無關,無論是哪個區域,儲存的都是物件例項。
進一步劃分的目的是為了更好地回收記憶體,或者更快的分配記憶體。
《Java Virtual Machine Specification Java SE 7 中文版》
在Java虛擬機器中,堆(Heap)是可供各條執行緒共享的執行時記憶體區域,也是供所有類例項和陣列物件分配記憶體的區域。
Java堆在虛擬機器啟動的時候就被建立,它儲存了被自動記憶體管理系統(垃圾蒐集器)所管理的各種物件。
(本規範中所描述的 Java 虛擬機器並未假設採用什麼具體的技術去實現自動記憶體管理系統。虛擬機器實現者可以根據系統的實際需要來選擇自動記憶體管理技術。)
Java堆的容量是固定大小的,也可以隨著程式執行的需求動態擴充套件,並在不需要過多空間時自動收縮。
Java堆所使用的記憶體不需要保證是連續的。
注: 如果實際所需的堆超過了自動記憶體管理系統能提供的最大容量,那 Java 虛擬機器將會丟擲一個OutOfMemoryError 異常。
《Java Virtual Machine's Internal Architecture》
在JVM執行時資料區中,堆扮演的是儲存公共資料的角色,就好像是電腦中的硬碟。
只有正在執行的Java應用程式中建立類例項或陣列,才會在堆中分配記憶體以存放物件。
擴充套件
這篇文章中解釋的很好,堆就是一個儲存單位。(推薦大家可以看下)
http://hllvm.group.iteye.com/group/wiki/2858-JVM