1. 程式人生 > >深入理解JVM(二)自動記憶體管理機制

深入理解JVM(二)自動記憶體管理機制

2.1 C、C++記憶體管理是由開發人員管理,而Java則交給了JVM進行自動管理

2.2 JVM執行時資料區:方法區、堆(執行時執行緒共享),虛擬機器棧、本地方法棧、程式計數器(執行時執行緒隔離,私有)

  2.2.1 程式計數器(Program Counter Register):每一個執行緒都獨有一個程式計數器,並且分配了一塊執行緒私有的小塊記憶體,程式執行時,這個計數器會記錄位元組碼檔案執行的行數,當執行緒切換時,則通過這個行數繼續執行下面的操作

  2.2.2 虛擬機器棧(Java Virtual Machine Stacks):

  (1)虛擬機器棧是描述Java方法執行的記憶體模型(棧幀做著分配和排程的事情),一般描述的“棧”就是這個虛擬機器棧,還指的是區域性變量表,包括各種基本資料型別(boolear,byte,char,short,int,long,float,double),還有引用物件的地址;

  (2)StackOverFlowError和OutOfMemerryError都和虛擬機器棧有關,前者是當執行緒請求的棧深度大於虛擬機器所允許的深度時的異常,後者是動態擴充套件虛擬機器棧深度之後還是超大了會出現的異常;

  2.2.3 本地方法棧(Native Method Stacks):和虛擬機器棧高度相似,只不過虛擬機器棧用於執行Java方法位元組碼分配的記憶體,而本地方法棧是用於本地方法,它和虛擬機器棧會丟擲同樣的異常;關於本地方法:https://www.cnblogs.com/chen-jack/p/7904510.html

  2.2.4 堆(Java Heap):存放物件例項,執行緒共享,垃圾回收(新生代、老年代),記憶體分配可以通過-Xmx和-Xms來分配(既可擴充套件也可固定),超出分配的大小會出現OutOfMemeryError異常;

  2.2.5 方法區(Method Area):執行緒共享,儲存(常量(final)、靜態變數、虛擬機器載入的類資訊等),永久代(並不準確,只是用永久代去實現方法區,達到回收的效果,Java1.8之後沒有永久代了);

  2.2.6 執行時常量池(Runtime Constant Pool)