新聞中心
Java虛擬機所管理的內(nèi)存將會包括以下幾個運行時數(shù)據(jù)區(qū)域:
創(chuàng)新互聯(lián)公司主要為客戶提供服務項目涵蓋了網(wǎng)頁視覺設計、VI標志設計、成都全網(wǎng)營銷推廣、網(wǎng)站程序開發(fā)、HTML5響應式網(wǎng)站建設、手機網(wǎng)站制作設計、微商城、網(wǎng)站托管及成都網(wǎng)站維護、WEB系統(tǒng)開發(fā)、域名注冊、國內(nèi)外服務器租用、視頻、平面設計、SEO優(yōu)化排名。設計、前端、后端三個建站步驟的完善服務體系。一人跟蹤測試的建站服務標準。已經(jīng)為成都資質(zhì)代辦行業(yè)客戶提供了網(wǎng)站改版服務。
1、程序計數(shù)器
2、Java虛擬機棧
3、本地方法棧
4、Java堆
5、方法區(qū)
下面分別介紹各個內(nèi)存分區(qū)及它們的作用:
1、程序計數(shù)器
(PC)程序計數(shù)器是一塊較小的內(nèi)存分區(qū),你可以把它看做當前線程所執(zhí)行的字節(jié)碼的指示器。
在虛擬機的概念模型里,字節(jié)碼指示器工作時,就是通過改變計數(shù)器的值來選擇下一條需要執(zhí)行的字節(jié)碼指令。
程序技術器為線程私有,每個線程都有它們各自的程序計數(shù)器,這樣再多線程的情況下,線程之間的來回切換,也能正確找到上次切換時執(zhí)行的位置。(線程隔離的,線程安全的)
如果線程正在執(zhí)行的是一個Java方法,那么程序計數(shù)器記錄的是當前線程正在執(zhí)行的字節(jié)碼指令的地址;如果線程正在執(zhí)行的是一個native方法,則計數(shù)器值為空。
此內(nèi)存區(qū)域是唯一一個Java虛擬機規(guī)范中沒有規(guī)定任何內(nèi)存泄漏OutOfMemoryError(OOM)情況的區(qū)域。
2、Java虛擬機棧
虛擬機棧也為線程私有的,它的生命周期與線程相同;
虛擬機??梢钥醋鍪荍ava方法執(zhí)行的內(nèi)存模型:每個方法執(zhí)行的同時都會創(chuàng)建一個棧幀用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。一個Java方法從調(diào)用到執(zhí)行完的過程,就對應著一個棧幀從虛擬機棧入棧到出棧的過程;
局部變量表中存放了編譯期可知的基本數(shù)據(jù)類型、對象引用、returnAddress類型(指向了一條字節(jié)碼指令的地址);
在虛擬機棧中可能會出現(xiàn)兩種異常:StackOverflowError和OutOfMemory。
StackOverflowError:如果線程請求的棧深度大于當前虛擬機所允許的深度,會拋出該異常;
OutOfMemory:如果虛擬機棧可以動態(tài)擴展,當擴展時無法申請到足夠的內(nèi)存,會拋出該異常;
3、本地方法棧
本地方法棧類似與虛擬機棧,它們不同之處在于,虛擬機棧是為虛擬機執(zhí)行的Java方法服務,而本地方法棧是為虛擬機使用到的Native方法服務;
在本地方法棧可能會出現(xiàn)兩種異常:StackOverflowError和OutOfMemory
4、Java堆
Java堆是被所有線程共享的一塊區(qū)域,它也是Java虛擬機管理的內(nèi)存中最大的一塊,它在虛擬機啟動時創(chuàng)建;
Java堆唯一的目的就是存放對象實例,幾乎所有的對象實例的都在這里分配內(nèi)存;
Java堆是垃圾收集器管理的主要區(qū)域,因此很多時候也被稱為GC堆;
Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上連續(xù)即可,在實現(xiàn)時既可以是固定大小也可以是可擴展的,如果堆中沒有內(nèi)存完成實例分配,并且堆也無法再擴展時,將會拋出OutOfMemory異常;
5、方法區(qū)(運行時常量池)
方法區(qū)也是內(nèi)存共享的一塊區(qū)域,它用于存放已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù);
方法區(qū)中,垃圾收集比較少見,但并不是不進行GC,這個區(qū)域的回收目標主要是針對常量池的回收和對類型的卸載
方法區(qū)類似于Java堆,不要連續(xù)的內(nèi)存和可以選擇固定大小或者可擴展。它還可以選擇不實現(xiàn)垃圾收集;
當方法區(qū)無法滿足內(nèi)存分配需求時,會拋出OutOfMemory異常;
方法區(qū)中還存在一個運行時常量池(無關乎線程安全與否)(因為其數(shù)據(jù)不能更改),常量池用于存放編譯期生成的各種字面量和符號引用,它具有動態(tài)性,不要求常量一定只有編譯期才能產(chǎn)生,運行期間也可能將新的常量放入池中;
本文標題:Java虛擬機的內(nèi)存分區(qū)和用途
鏈接URL:http://fisionsoft.com.cn/article/pgosos.html