您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Java內(nèi)存數(shù)據(jù)區(qū)域的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
思維導(dǎo)圖
總共也就這么 5 個區(qū)(直接內(nèi)存不屬于 JVM 運行時數(shù)據(jù)區(qū)的一部分),除了程序計數(shù)器其他的地方都有可能出現(xiàn) OOM (OutOfMemoryError),其中像是程序計數(shù)器和兩個棧(Java 虛擬機棧 & 本地方法棧)都是每個線程要有一個的,所以肯定是線程隔離的。而其他 2 個區(qū)就是線程共享的了,也就是說,如果有多個線程要同時訪問這兩個區(qū)的數(shù)據(jù),是會出現(xiàn)線程安全問題的。接下來,我們將對這些區(qū)域進行詳細(xì)的介紹。
當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來確定下一條要執(zhí)行的字節(jié)碼指令的位置
執(zhí)行 Java 方法和 native 方法時的區(qū)別:
執(zhí)行 Java 方法時:記錄虛擬機正在執(zhí)行的字節(jié)碼指令地址;
執(zhí)行 native 方法時:無定義;
是 5 個區(qū)域中唯一不會出現(xiàn) OOM 的區(qū)域。
Java 虛擬機棧
Java 方法執(zhí)行的內(nèi)存模型,每個方法執(zhí)行的過程,就是它所對應(yīng)的棧幀在虛擬機棧中入棧到出棧的過程;
服務(wù)于 Java 方法;
可能拋出的異常:
OutOfMemoryError(在虛擬機??梢詣討B(tài)擴展的情況下,擴展時無法申請到足夠的內(nèi)存);
StackOverflowError(線程請求的棧深度 > 虛擬機所允許的深度);
虛擬機參數(shù)設(shè)置:-Xss
.
本地方法棧
服務(wù)于 native 方法;
可能拋出的異常:與 Java 虛擬機棧一樣。
Java 堆
唯一的目的:存放對象實例;
垃圾收集器管理的主要區(qū)域;
可以處于物理上不連續(xù)的內(nèi)存空間中;
可能拋出的異常:
OutOfMemoryError(堆中沒有內(nèi)存可以分配給新創(chuàng)建的實例,并且堆也無法再繼續(xù)擴展了)。
虛擬機參數(shù)設(shè)置:
最大值:-Xmx
最小值:-Xms
兩個參數(shù)設(shè)置成相同的值可避免堆自動擴展。
存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù);
類信息:即 Class 類,如類名、訪問修飾符、常量池、字段描述、方法描述等。
垃圾收集行為在此區(qū)域很少發(fā)生;
不過也不能不清理,對于經(jīng)常動態(tài)生成大量 Class 的應(yīng)用,如 Spring 等,需要特別注意類的回收狀況。
運行時常量池也是方法區(qū)的一部分;
Class 文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項是常量池,用于存放編譯器生成的各種字面量(就是代碼中定義的 static final 常量)和符號引用,這部分信息就存儲在運行時常量池中。
可能拋出的異常:
OutOfMemoryError(方法區(qū)無法滿足內(nèi)存分配需求時)。
JDK 1.4 的 NIO 類可以使用 native 函數(shù)庫直接分配堆外內(nèi)存,這是一種基于通道與緩沖區(qū)的 I/O 方式,它在 Java 堆中存儲一個 DirectByteBuffer 對象作為堆外內(nèi)存的引用,這樣就可以對堆外內(nèi)存進行操作了。因為可以避免 Java 堆和 Native 堆之間來回復(fù)制數(shù)據(jù),在一些場景可以帶來顯著的性能提高。
虛擬機參數(shù)設(shè)置:-XX:MaxDirectMemorySize
默認(rèn)等于 Java 堆最大值,即 -Xmx
指定的值。
將直接內(nèi)存放在這里講解的原因是它也可能會出現(xiàn) OutOfMemoryError;
服務(wù)器管理員在配置 JVM 參數(shù)時,會根據(jù)機器的實際內(nèi)存設(shè)置 -Xmx
等信息,但經(jīng)常會忽略直接內(nèi)存(默認(rèn)等于 -Xmx
設(shè)置值),這可能會使得各個內(nèi)存區(qū)域的總和大于物理內(nèi)存限制,從而導(dǎo)致動態(tài)擴展時出現(xiàn) OOM。
關(guān)于“Java內(nèi)存數(shù)據(jù)區(qū)域的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。