1. 程式人生 > >JVM(二) 記憶體區域與記憶體溢位異常

JVM(二) 記憶體區域與記憶體溢位異常

一 執行時資料區域:

![這裡寫圖片描述](https://img-blog.csdn.net/20180914092258976?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lvbGFuZGVyYQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

二 程式計數器

·記錄當前執行緒所執行到的位元組碼的行號。位元組碼直譯器工作的時候就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令。

·JVM的多執行緒是通過執行緒輪流切換並分配處理器來實現的,在任何一個確定的時刻,一個處理器都只會執行一條執行緒中的指令

,每條執行緒都有獨立的私有的程式計數器。

·但是如果執行緒中執行的是一個本地方法時,程式計數器中的值為空。這也是是唯一一個在JVM上不會發生記憶體溢位異常(OutOfMemoryError)的區域。

三 Java 虛擬機器棧

·執行緒私有的,與執行緒宣告週期相同.

·每個方法執行的時候會建立一個棧幀,用於儲存區域性變量表、運算元長棧,動態連結、方法出口等.沒一個方法從呼叫到執行完成,對應一個棧幀在虛擬機器棧中入棧到出棧的過程.

·區域性變量表存放了編譯期可知的各種基本資料型別,物件應用型別,returnAddress型別. ·StackOverflowError異常:執行緒請求的棧的深度大於虛擬機器所允許的深度時 ·OutOfMemoryError異常:JVM無法申請到足夠的記憶體時(也適用於其他資料區域)

四 Java堆

·JVM所管理的記憶體最大一塊,也是執行緒共享的

·幾乎所有的物件例項都在這裡分配記憶體

·Java堆可以處在物理上不連續的記憶體空間中,只要邏輯上連續即可.

·Java堆 擴充套件引數: -Xmx -Xms. 表示最大和最小堆記憶體,如果相等就不能擴充套件

五 方法區 ·執行緒共享,用於儲存被虛擬機器載入的類資訊,常量,靜態變數等

·含有執行時常量池

六 常量池 ·用於存放編譯期生成的各種直面量和符號引用,類載入後就進入方法區的常量池重點內容存放.

七 直接記憶體 ·不是JVM執行時資料區的一部分,但是這部分記憶體也是頻繁使用,也會有OutOfMemoryError異常.

八 物件建立過程; 1. 虛擬機器遇到一條new指令的時候,首先建倉這個指令的引數能否在常量池中定位到一個類的符號引用,並檢查這個引用指向的類是否已經被載入,解析和初始化過.如果沒有,那必須先執行相應的類載入過程(詳見JVM(七)).

·類載入完成後,物件所需記憶體就確定了.

·分配記憶體

·記憶體分配完成後,虛擬機器需要將分配到的記憶體空間都初始化為零值(不包含物件頭).這也保證了示例在Java程式碼中不賦初始值就可以直接使用.

·設定

·執行init方法