java記憶體地區的分布

來源:互聯網
上載者:User

標籤:位元組   靜態變數   jvm   編譯   基本   運行   過程   方法區   儲存   

讀了《深入理解Java虛擬機器》之後,當時理解了,過段時間又忘記了,在此做下記錄,方便自我回顧,也希望能幫到想要學習虛擬機器的同學。

Java虛擬機器在執行java程式時會把它所管理的記憶體分為5個不同的資料區域(也可以細分為7個不同的地區,後續做介紹):程式計數器、Java虛擬機器棧、本地方法棧、Java堆、方法區

          java虛擬機器運行時資料區

  1、程式計數器:用來記錄正在執行的虛擬機器位元組碼指令地址。可通過改變這個計數器的值來選取下一條需要執行的位元組碼指令。

    • 線程私人:為了線程切換後能恢複到正確的位置,每條線程都需要有一個獨立的程式計數器,各條線程之間計數器互不影響。

  2、Java虛擬機器棧:線程私人,生命週期與線程相同,每當建立一個線程時,JVM就會為這個線程建立一個對應的java棧。在這個java棧中又會包含多個棧幀,每運行一個方法就建立一個棧幀,用於儲存局部變數表、操作棧、方法傳回值等。每一個方法從調用直至執行完成的過程,就對應一個棧幀在java棧中入棧到出棧的過程。

    • 局部變數表:存放編譯器可知的各種基礎資料型別 (Elementary Data Type)、對象引用。

  3、本地方法棧:與虛擬機器棧發揮的作用相似,區別在於:虛擬機器棧為虛擬機器執行java方法(也就是位元組碼)服務,本地方法棧為虛擬機器使用到的Native方法服務。

  4、java堆:儲存物件執行個體以及數組。是垃圾收集器管理的主要區域。

    • 線程共用。java堆可以處於物理上不連續的記憶體空間,只要邏輯上連續即可。

  5、方法區:用於存放類資訊(如類名、存取修飾詞等)、常量池、靜態變數、即時編譯器便宜後的代碼等。雖然JVM規範把方法區描述為堆的一個邏輯部分, 但它卻有個別名non-heap(非堆),目的應該是與Java堆區分開來。    

  6、運行時常量池:方法區的一部分,用於存放編譯期產生的各種字面量和符號引用。

    • 常量池:指的是編譯期被確定並被儲存在已編譯的.class檔案中的一些資料,除了包含代碼中所定義的各種基本類型(如int、long等)和物件類型(如String和數組)的常量值(final),還包含一些以文本形式出現的一些符號引用。

  7、直接記憶體:堆外的記憶體。它不是虛擬機器運行時資料區的一部分,也不是java虛擬機器規範中定義的記憶體地區。      

java記憶體地區的分布

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.