jvm學習筆記
自動記憶體管理
運行時數據區
運行時數據區主要包括虛擬機棧、本地方法棧、程式計數器、方法區、堆等,其中方法區和堆屬於執行緒共享記憶體區域;虛擬機棧和本地方法棧屬於執行緒隔離的數據區

程式計數器
佔用記憶體空間較小,可以當作是當前執行緒執行的位元組碼行號指示器。jvm的多執行緒是通過執行緒切換並分配一定處理時間的方式來實現的,所以多個執行緒在運行時候,當前執行緒退出cpu時,必須有個東西記住當前執行緒執行的java方法的虛擬機位元組碼指令的地址。如果當前正在執行的方法是本地方法(native),計數器值為空。程式計數器不會導致oom
java虛擬機棧
java虛擬機棧也是屬於執行緒私有的一塊記憶體區域。生命周期和執行緒相同;java虛擬機棧描述的時java方法執行時候的記憶體模型:每個方法的運行時候會創建一個棧幀,用處儲存局部變數表、操作數棧、方法出口、動態鏈接等資訊。每個方法的調用到執行完畢,對應的就是這個棧幀的入棧到出棧的過程;
局部變數表:用於儲存對象的引用(可能是對象在堆中的記憶體地址,也可能是一個該對象的句柄的地址,編譯期可知的各種基本數據類型,其中long和double各佔兩個位元組,別的都時一個位元組。局部變數表在棧幀中的空間大小是進入方法時候就已經完全確定了,而且中間不會改變。
操作數棧: 一個方法的調用執行其實就是方法調用時創建一個棧幀,然後再棧幀內部會根據類的資訊獲取指令,從局部變數表中取數據,進行操作數棧的入棧出棧方式執行指令。

java堆
java堆是虛擬機管理的最大的一塊記憶體區域,在虛擬機啟動的時候分配空間;java堆存在的主要作用是存放對象實例;他也是垃圾收集器主要管理的一塊記憶體區域;從垃圾回收的角度來看,可以將java堆分為新生代和老年代,細一點可以分為eden區,to Survivor區,from Survivor區等。從記憶體分配的角度,java堆可能劃分出來多個執行緒私有的記憶體分配緩衝區( Thread Local Allocation Buffer)簡稱TLAB;我們系統運行中出現的oom最多就是出現在java堆中。

