1. 程式人生 > >java內存區域管理和內存溢出

java內存區域管理和內存溢出

動態 解釋 byte 技術 異常情況 銷毀 共享 ret 對象

一、概述:

    java虛擬機在執行java程序時會把它所管理的內存劃分為若幹個不同的數據區域,這個區域有各自的用途以及創建和銷毀時間,有些區域跟隨虛擬機進程的啟動而存在,有些區域則依賴用戶線程的啟動和結束而建立和銷毀。

技術分享圖片

二、程序計數器:

    程序計數器是一塊較小的內存空間,可以看作是當前線程所執行的字節碼的行號顯示器。在概念模型裏,字節碼解釋器的工作就是通過改版這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。

    在任何一個確定的時刻,一個處理器只會執行一條線程中的指令。因此,為了線程切換後能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲。

    如果線程正在執行的是一個java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;如果正在執行的是Native方法,這個計數器則為空。

    程序計數器是唯一一個在Java虛擬機規範中沒有規定任何OutOfMemoryError情況的區域。

三、Java虛擬機棧

  虛擬機棧而是線程私有的。虛擬機棧描述的是Java方法執行的內存模型:每個方法在執行的同時會創建一個棧幀用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用到完成的過程,對應著一個棧幀在虛擬機棧中入棧到出棧的過程。

  局部變量存放了編譯期可知的各種基本數據類型(boolean、byte、char、short、int、float、long、double)、對象引用、returnAddress類型(指向了一條字節碼指令的地址)

  異常情況:1、如果線程請求的棧深度大於虛擬機所允許的深度,則拋出StackOverflowError異常 2、如果虛擬機棧可以動態擴展,如果擴展時無法申請到足夠的內存,就會拋出OutOfMemoryError異常

四、本地方法棧

    與虛擬機棧不同,本地方法棧是服務於native方法服務。

    會拋出StackOverflowError異常和OutOfMemoryError異常。

五、java堆

    線程共享的內存區域。

    會拋出OutOfMemoryError異常。

六、方法區

      線程共享的內存區域,用於存儲已經被虛擬機棧加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。

     會拋出OutOfMemoryError異常。

java內存區域管理和內存溢出