本文主要給大家簡單講講java中劃分JVM內(nèi)存區(qū)域的詳細方法,相關(guān)專業(yè)術(shù)語大家可以上網(wǎng)查查或者找一些相關(guān)書籍補充一下,這里就不涉獵了,我們就直奔主題吧,希望java中劃分JVM內(nèi)存區(qū)域的詳細方法這篇文章可以給大家?guī)硪恍嶋H幫助。
青白江網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站成立與2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。
什么是JVM?JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設(shè)備的規(guī)范,它是一個虛構(gòu)出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。Java虛擬機包括一套字節(jié)碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。
JVM屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息,使Java程序只需生成在Java虛擬機上運行的目標代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行。JVM在執(zhí)行字節(jié)碼時,實際上最終還是把字節(jié)碼解釋成具體平臺上的機器指令執(zhí)行。
JVM內(nèi)存區(qū)域
JVM在運行時候會將他管理的內(nèi)存劃分為多個區(qū)域,每個區(qū)域都有自己的用途,生命周期。下面我們根據(jù)內(nèi)存分區(qū)圖片逐個擊破:
程序計數(shù)器(Program Counter Register)
程序計數(shù)器所占內(nèi)存小,他的作用可以看做是當前線程所執(zhí)行的字節(jié)碼的指示器,通過改變計數(shù)器的值來獲取下一條字節(jié)碼指令。
程序計數(shù)器在執(zhí)行Native方法的時候,計數(shù)器的值為空(undefined)。
程序計數(shù)器是線程私有的,每個線程都會分派一個。
在線視頻教程分享:java學(xué)習
虛擬機棧(VM Stack)
虛擬機棧為JVM執(zhí)行java方法服務(wù),每個方法被執(zhí)行的時候都會創(chuàng)建一個棧楨(Stack Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。每一個方法從調(diào)用直至執(zhí)行結(jié)束,就對應(yīng)著一個棧幀從虛擬機棧中入棧到出棧的過程。
虛擬機棧的局部變量表內(nèi)存儲了以下數(shù)據(jù):
基本類型數(shù)據(jù)(boolean、byte、char、short、int、float、long、double)
對象引用(reference 類型)
returnAddress 類型(指向了一條字節(jié)碼指令的地址)
需要注意的是局部變量表所需的內(nèi)存空間在編譯期間就已經(jīng)確定了,大小不再變動。
虛擬機棧也是線程私有的,每個線程都會分派一個。
JVM對虛擬機棧規(guī)定了兩種異常:
StackOverflowError:線程請求的棧深度大于虛擬機所允許的深度。
OutOfMemoryError:如果虛擬機??梢詣討B(tài)擴展,而擴展時無法申請到足夠的內(nèi)存。
本地方法棧(Native Method Stack)
本地方法棧與虛擬機棧類似,主要區(qū)別就在于本地方法棧是專門為Native方法提供服務(wù)。
Native方法:在java中由Native關(guān)鍵字聲明的方法,非java語言實現(xiàn),是引用本地庫提供的第三方語言方法。
本地方法棧也是線程私有的,每個線程都會分派一個。
堆(Heap)
堆是所有線程共享的內(nèi)存區(qū)域,在JVM啟動時創(chuàng)建,一般是JVM內(nèi)占用最大的一塊,垃圾收集器(GC)管理的主要區(qū)域。
堆中主要存儲的數(shù)據(jù)為:
對象
數(shù)組
堆可以在物理上不連續(xù),而只要在邏輯上連續(xù)即可,因此是一個可擴展的內(nèi)存區(qū)域。
當堆內(nèi)存大小不夠創(chuàng)建對象或數(shù)組所占用的內(nèi)存大小,并且不能夠再擴展時,會拋出OutOfMemoryError異常。
方法區(qū)(Method Area)
方法區(qū)也是所有線程共享的內(nèi)存區(qū)域。
方法區(qū)主要存儲的數(shù)據(jù)為:
已被JVM加載的類信息
常量(從jdk1.7開始,運行時常量池移動到了堆中)
靜態(tài)變量
即時編譯器編譯后的代碼等數(shù)據(jù)
垃圾收集器(GC)比較少出現(xiàn)在這個區(qū)域,主要的內(nèi)存回收目標是常量池的回收和對類型的卸載。
當方法區(qū)無法滿足內(nèi)存分配需求時,會拋出OutOfMemoryError異常。
常量池(Runtime Constant Pool)
常量池屬于方法區(qū)一部分,用于存放編譯期生成的各種字面量和符號引用。編譯期和運行期(String 的 intern() )都可以將常量放入池中。內(nèi)存有限,無法申請時拋出 OutOfMemoryError異常。
從jdk1.7開始,運行時常量池移動到了堆中。
直接內(nèi)存(Direct Memory)
直接內(nèi)存并不是JVM運行時內(nèi)存數(shù)據(jù)區(qū)域,也不是JVM規(guī)范中定義的內(nèi)存。
直接內(nèi)存占用物理內(nèi)存大小,需要注意在分配JVM內(nèi)存的時候要把直接內(nèi)存也計算在內(nèi),否則在動態(tài)擴展內(nèi)存時可能出現(xiàn)OutOfMemoryError異常。
java中劃分JVM內(nèi)存區(qū)域的詳細方法就先給大家講到這里,對于其它相關(guān)問題大家想要了解的可以持續(xù)關(guān)注我們的行業(yè)資訊。我們的板塊內(nèi)容每天都會捕捉一些行業(yè)新聞及專業(yè)知識分享給大家的。