總是記不住這幾個運行時數據區,還是再捋一遍吧。
常見分類,一共5個區域,分爲2種類型:
- 線程共享
- 方法區 Method Area
- 堆內存 Heap
- 線程獨享
- 虛擬機棧 VM Stack
- 本地方法棧 Native Method Stack
- 程序計數器 Program Counter Register
1.方法區
存儲已被虛擬機加載的類型信息、常量、靜態變量、即時編譯後的代碼緩存等數據。
JDK6時,計劃放棄永久代,逐步改爲本地內存來實現方法區的計劃;
JDK7,把原本放在永久代的字符串常量池、靜態變量等移出;
JDK8,完全廢棄永久代的概念,改用在本地內存中實現的元空間Meta-space來代替,把JDK7遺留的(主要是類型信息)全部移到元空間中。
2.堆內存
G1收集器出現爲分界,之前,業界絕對主流的Hotspot虛擬機,內部垃圾收集器全部都基於“經典分代”來設計,需要新生代、老年代收集器搭配才能工作;之後,Hotspot虛擬機裏也出現了不採用分代設計的新垃圾收集器。
所有線程共享的Java堆中,可以劃分出多個線程私有的分配緩衝區(Thread Local Allocation Buffer, TLAB),以提升對象分配時的效率。