1. 程式人生 > >第二章 java記憶體區域與記憶體溢位異常

第二章 java記憶體區域與記憶體溢位異常

一、執行時的資料區域

執行時資料區

java虛擬機器執行時的資料區域

主要分為以下幾個區域:

1 、程式計數器

    它佔用較小的一塊記憶體空間,可以看做是當前執行緒執行的位元組碼的行號指示器。每個執行緒都需要擁有自己的的程式計數器,以滿足在多執行緒情況下,執行緒不斷切換自身能夠恢復到正確狀態,是執行緒私有的一塊記憶體。在執行java程式的時候,它記錄的是正在執行的虛擬機器的位元組碼指令的地址,在執行本地方法的時候,它的值為空。它也是java虛擬機器規範中沒有規定任何OutOfMemoryError情況的區域。

2、java虛擬機器棧

   它也是執行緒私有的記憶體區域,生命週期和執行緒一樣。每個方法在執行的時候都會建立一個棧幀,用於儲存區域性變量表,運算元棧,動態連結,方法出口等。每個方法從呼叫到執行結束就對應著一個棧幀在虛擬機器棧中的入棧和出棧過程,區域性變量表所需要的記憶體空間在編譯的時候完成分配。

       JVM stack 可以被實現成固定大小,也可以根據計算動態擴充套件。

在java虛擬機器規範中,這塊區域規定了兩種異常,一個是當執行緒請求的棧深度大於虛擬機器所允許的深度,將丟擲StackOverFlow異常;另一個就是在虛擬機器動態擴充套件的時候,無法申請到足夠的記憶體,會丟擲OutOfMemofyError異常。

3、Java堆

   java堆是java虛擬機器所管理的記憶體最大的一塊區域,它被所有執行緒共享,在虛擬機器啟動的時候建立。它主要存放虛擬機器的物件例項和陣列。同時它也是垃圾收集器管理的主要區域,當堆中的記憶體不夠完成例項的分配會丟擲OutOfMemofyError異常。

    java堆雖然是共享的,但是從記憶體分配的角度看,java堆中可能劃分出多個執行緒私有的分配緩衝區(TLAB:Thead Local Allocation Buffer)

4、方法區

   它也是執行緒共享的記憶體區域,用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料,當方法區中的記憶體不夠完成記憶體的分配會丟擲OutOfMemofyError異常。

5、執行時常量池

    它是方法區的一個部分,用於存放編譯期間生成的各種字面量和符號引用,這些內容在類載入後,進入到方法區的執行時常量池中。當方法區中的記憶體不夠完成記憶體的分配會丟擲OutOfMemofyError異常。

6、本地方法棧

它和虛擬機器的java棧類似,不過本地方法棧為虛擬機器執行java方法服務,而本地方法棧則為虛擬機器使用到的Native方法服務,它也會丟擲StackOverFlow異常和OutOfMemofyError異常

7、 直接記憶體

    它不是虛擬機器執行時的資料區的一部分,也不是虛擬機器規範中定義的記憶體區域,但是它會被頻繁的使用。

二、