您好,登錄后才能下訂單哦!
本文主要給大家簡單講講java中劃分JVM內存區域的詳細方法,相關專業術語大家可以上網查查或者找一些相關書籍補充一下,這里就不涉獵了,我們就直奔主題吧,希望java中劃分JVM內存區域的詳細方法這篇文章可以給大家帶來一些實際幫助。
什么是JVM?JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。
JVM屏蔽了與具體操作系統平臺相關的信息,使Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。JVM在執行字節碼時,實際上最終還是把字節碼解釋成具體平臺上的機器指令執行。
JVM內存區域
JVM在運行時候會將他管理的內存劃分為多個區域,每個區域都有自己的用途,生命周期。下面我們根據內存分區圖片逐個擊破:
程序計數器(Program Counter Register)
程序計數器所占內存小,他的作用可以看做是當前線程所執行的字節碼的指示器,通過改變計數器的值來獲取下一條字節碼指令。
程序計數器在執行Native方法的時候,計數器的值為空(undefined)。
程序計數器是線程私有的,每個線程都會分派一個。
在線視頻教程分享:java學習
虛擬機棧(VM Stack)
虛擬機棧為JVM執行java方法服務,每個方法被執行的時候都會創建一個棧楨(Stack Frame)用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用直至執行結束,就對應著一個棧幀從虛擬機棧中入棧到出棧的過程。
虛擬機棧的局部變量表內存儲了以下數據:
基本類型數據(boolean、byte、char、short、int、float、long、double)
對象引用(reference 類型)
returnAddress 類型(指向了一條字節碼指令的地址)
需要注意的是局部變量表所需的內存空間在編譯期間就已經確定了,大小不再變動。
虛擬機棧也是線程私有的,每個線程都會分派一個。
JVM對虛擬機棧規定了兩種異常:
StackOverflowError:線程請求的棧深度大于虛擬機所允許的深度。
OutOfMemoryError:如果虛擬機棧可以動態擴展,而擴展時無法申請到足夠的內存。
本地方法棧(Native Method Stack)
本地方法棧與虛擬機棧類似,主要區別就在于本地方法棧是專門為Native方法提供服務。
Native方法:在java中由Native關鍵字聲明的方法,非java語言實現,是引用本地庫提供的第三方語言方法。
本地方法棧也是線程私有的,每個線程都會分派一個。
堆(Heap)
堆是所有線程共享的內存區域,在JVM啟動時創建,一般是JVM內占用最大的一塊,垃圾收集器(GC)管理的主要區域。
堆中主要存儲的數據為:
對象
數組
堆可以在物理上不連續,而只要在邏輯上連續即可,因此是一個可擴展的內存區域。
當堆內存大小不夠創建對象或數組所占用的內存大小,并且不能夠再擴展時,會拋出OutOfMemoryError異常。
方法區(Method Area)
方法區也是所有線程共享的內存區域。
方法區主要存儲的數據為:
已被JVM加載的類信息
常量(從jdk1.7開始,運行時常量池移動到了堆中)
靜態變量
即時編譯器編譯后的代碼等數據
垃圾收集器(GC)比較少出現在這個區域,主要的內存回收目標是常量池的回收和對類型的卸載。
當方法區無法滿足內存分配需求時,會拋出OutOfMemoryError異常。
常量池(Runtime Constant Pool)
常量池屬于方法區一部分,用于存放編譯期生成的各種字面量和符號引用。編譯期和運行期(String 的 intern() )都可以將常量放入池中。內存有限,無法申請時拋出 OutOfMemoryError異常。
從jdk1.7開始,運行時常量池移動到了堆中。
直接內存(Direct Memory)
直接內存并不是JVM運行時內存數據區域,也不是JVM規范中定義的內存。
直接內存占用物理內存大小,需要注意在分配JVM內存的時候要把直接內存也計算在內,否則在動態擴展內存時可能出現OutOfMemoryError異常。
java中劃分JVM內存區域的詳細方法就先給大家講到這里,對于其它相關問題大家想要了解的可以持續關注我們的行業資訊。我們的板塊內容每天都會捕捉一些行業新聞及專業知識分享給大家的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。