線程私有:程序計數器、虛擬機棧、本地方法棧
- 程序計數器:記錄了程序執行的字節碼的行號和指令,方便線程切換。
- 虛擬機棧 :局部變量表(原生類型、引用類型),方法調用棧 --平時說的棧。可拋出StackOverflowError異常和OutOfMemoryError
- 本地方法棧則是爲虛擬機執行Native方法服務的。
線程共享:堆、方法區等。
-
堆(java Heap):新生代和老年代;再細緻一些可以分爲:Eden空間、From Survivor、To Survivor等。
-
方法區(Method Area):
與java堆一樣,是各個線程共享一塊內存區域,用於存儲虛擬機加在的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。雖然java虛擬機把他標註爲堆的一部分,但他也有一個別名“非堆”,用於與java堆區分。
對於HotSport虛擬機上開發、部署的程序員來說,很多人都更願意把方法區成爲"永久代"(Permanent Generation),進入永久代不代表不被垃圾回收了 -
運行時常量池(RuntimelyConstant Pool):
String類的intern()方法利用的比較多。 -
直接內存(DirectMemory)
不是虛擬機運行時數據區的一部分,也不是java迅疾規範中定義的內存區域。但這部分內存也被頻繁的使用,而且也可能導致OutOffMemoryError異常。