1. 程式人生 > >java 虛擬機內存介紹

java 虛擬機內存介紹

緩沖 stack 通過 符號 div 計數 異常 區域 每一個

已經入行快有兩年了,然而沒有認真看過java虛擬機內存的介紹,下面把自己看的關於java虛擬機內存的介紹寫下來,分享給大家。

java 虛擬機在運行時將內存分為幾個區域,分別為程序記數區,java虛擬機棧,本地方法棧,java堆,方法區,運行常量池。此外還有一個叫做直接內存的區域,雖然不是java虛擬機的一部分,但是也非常重要。

程序計數器

顧名思義就是記錄當前線程執行的字節碼的行號,由於java虛擬機中的多線程是通過多線程輪流切換來實現多線程的,為了線程在切換後能回復到正確的執行位置,每個線程都會有一個獨立的計數器,各線程之間應該是互不影響的。所以,在程序計數器所占有的區域是線程私有的。

  • 如果當前線程執行的是java方法,那麽程序計數器記錄的是字節碼的地址,如果執行的是native方法,計數器的值為空

Java虛擬機棧

java虛擬機棧是java方法執行的內存模型,每一個方法在執行時都換創建一個棧幀,用於存放局部變量表,操作數棧,動態鏈接,返回接口等信息。

我理解的是,當前在執行一個方法時先創建一個棧幀,如果在這個方法中調用了其他方法,那麽當前的棧幀就會壓棧,然後給調用的方法創建一個棧幀。這樣依次類推。

  • 局部變量表中存放的編譯器可知的數據類型,Boolean,byte,char,short等。對於方法中的對象,存儲的是引用。

  • 可能拋出的異常:如果請求深度超過棧的最大深度,將會跑出StackOutOfFlow異常,如果線程在請求棧內存時,沒有獲得足夠的內存,就會跑出OutOfMemery異常。

java堆

java堆是線程共享的區域,這裏主要存儲對象和數組的實例。垃圾回收也是主要在這一塊內存上。

方法區

方法區是線程共享的區域,他主要用於存儲虛擬機加載的類信息,常量,靜態變量。

運行時常量池

他是方法區的一部分,用於存放編譯器生成的各種字面常量和符號引用。

直接內存

這部分不是java虛擬機的內存,給予通道的緩沖區。存在於本機的內存中,不收java堆大小的限制,但如果太大,(加上虛擬機的內存超過本機內存時)也會報OutOfMemery異常。

java 虛擬機內存介紹