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

深入理解JVM(二)自動內存管理機制

tac ati stack 私有 數據 spa 自動 切換 tof

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)

    

深入理解JVM(二)自動內存管理機制