JVM內存模型


內存模型圖

  不管是什么程序,只要你想運行,必然都需要使用內存,在java家里,就需要java虛擬機專門設計內存的使用方式,java虛擬機在執行程序的過程中會把它所管理的內存划分為幾個不同的區域。

如圖:

  java虛擬機管理的內存就是由圖中幾個運行時的數據區域組成,分為方法區、java堆、java棧、本地方法棧、程序計數器。

  其中,java棧、本地方法棧和程序計數器是線程隔離的區域,也就是說,每個線程都各有自己的一份。

 

程序計數器

  為了保證程序能夠達到自動連續執行的效果,CPU必須要確定下一條指令的地址,所以,程序計數器又被稱作指令計數器,也有稱作PC寄存器的叫法。

  我們可以把程序計數器看成當前線程所執行的字節碼的行號指示器,虛擬機通過改變這個程序計數器的值來選取下一條需要執行的字節碼指令。 

  對單核CPU來說,每一時刻只能有一個線程處於運行狀態,直到當前線程執行完或者被掛起,讓出CPU資源之后,才會輪到下一個線程進來運行。如果是多核CPU,是可以同時跑多線程的,線程與線程之間也是互不相干,當線程數量大於CPU數量時,也會和單核CPU一樣進行一個輪訓切換來分配資源,為了確保線程切換后能夠恢復到正常的位置繼續執行,每個線程就必須要有自己的程序計數器,程序計數器是線程獨有的一塊內存空間。

  如果當前線程正在執行一個java方法,則程序計數器記錄正在執行的java字節碼地址,如果當前線程正在執行一個本地方法,那么程序計數器為空。

java棧

  每一個線程都有一個私有的java棧,java棧在線程創建的時候被創建,其中保存着幀信息。(每個方法在執行的同時都會創建一個棧幀,用於保存局部變量、方法參數、方法出口等信息,每一個方法從調用到執行完成的過程,都對應着一個棧幀在java棧中入棧到出棧的過程)

  簡而言之,當線程調用java方法時,虛擬機會創建一個新的棧幀並且將其壓入java棧。

  棧的優勢去訪問速度比堆要快,僅次於程序計數器。

本地方法棧

  本地方法棧和java棧非常類似,不同之處在於java棧用於java方法的調用,而本地方法棧用於本地方法的調用。

注意:本地方法棧不是用java實現的,而是使用C實現的。

java堆

  堆在JVM啟動的時候會被創建,我們可以把它理解成一個內存池,用來存放所有的java對象,所有的線程共享java堆。

方法區

  方法區和堆一樣是所有線程共享的區域,主要保存的信息是類的元數據,包括類的類型信息、常量、靜態變量、域信息、方法信息等數據。

  方法區中的信息來源於類裝載子系統,類裝載子系統加載class信息,加載到的東西就存放於方法區的內存空間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM