JVM(一)—Java記憶體模型
Java虛拟機記憶體包括如下幾個運作時資料區域:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CM0cDNzUzYhBDOmdTZzM2NzYzX3ADNxETMyIzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
- 程式計數器
- 虛拟機棧
- 本地方法棧
- 堆
- 方法區
1 程式計數器—線程私有
程式計數器是目前線程執行的位元組碼的行号訓示器。
程式計數器占用一塊較小的記憶體,線程私有。
為什麼需要 程式計數器?
因為Java虛拟機的多線程是通過線程切換獲得CPU執行時間來執行的。每個處理器隻會處理一條線程,為了處理器切換線程時能回到之前所執行的位置,每個線程都要有一個 程式計數器,記錄目前線程執行的位元組碼的位置。是以是線程私有的。
2 Java虛拟機棧—線程私有
虛拟機棧主要存放局部變量表,操作數棧,動态連結和方法出口等資訊。其中局部變量表主要是基本資料類型和對象的引用。
1)運作執行時情況
每個方法在執行時,都會建立一個棧幀用于存儲局部變量表,操作數棧,動态連結和方法出口等資訊。每一個方法從調用到執行完成的過程,就對應着一個棧幀在Java虛拟機棧中入棧到出棧的過程。
2)兩種異常
StackOverflowError:線程申請的棧記憶體過大;
OutofMemoryError:棧記憶體不夠時。
3 本地方法棧—線程私有
本地方法棧中存儲的是本地方法Native方法的資訊。
4 Java堆—線程共享
主要用來存放對象執行個體和數組。
也是垃圾收集器管理的主要區域。
5 方法區—線程共享
用于存儲被虛拟機加載的類資訊、常量、靜态變量、即時編譯後的代碼等資料。