前言
作爲Java程序員,你有沒有被JVM傷害過?面試的時候是否碰到過對JVM的靈魂拷問?
一、JVM 內存區域劃分
1.程序計數器(線程私有)
程序計數器(Program Counter Register),也有稱作爲 PC 寄存器。保存的是程序當前執行的指令的地址(也可以說保存下一條指令的所在存儲單元的地址),當 CPU 需要執行指令時,需要從程序計數器中得到當前需要執行的指令所在存儲單元的地址,然後根據得到的地址獲取到指令,在得到指令之後,程序計數器便自動加 1 或者根據轉移指針得到下一條指令的地址,如此循環,直至執行完所有的指令。也就是說是用來指示執行哪條指令的。
由於在 JVM 中,多線程是通過線程輪流切換來獲得 CPU 執行時間的,因此,在任一具體時刻,一個 CPU 的內核只會執行一條線程中的指令,因此,爲了能夠使得每個線程都在線程切換後能夠恢復在切換之前的程序執行位置,每個線程都需要有自己獨立的程序計數器,並且不能互相被幹擾,否則就會影響到程序的正常執行次序。因此,可以這麼說,程序計數器是每個線程所私有的。
在 JVM 規範中規定,如果線程執行的是非 native 方法,則程序計數器中保存的是當前需要執行的指令的地址;如果線程執行的是 native 方法,則程序計數器中的值是 undefined。
由於程序計數器中存儲的數據所佔空間的大小不會隨程序的執行而發生改變,因此,對於程序計數器是不會發生內存溢出現象(OutOfMemory)的。
異常情況:
不存在
2.Java 棧(線程私有)
3.本地方法棧(線程私有)