溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java內(nèi)存數(shù)據(jù)區(qū)域的示例分析

發(fā)布時間:2021-12-27 10:54:29 來源:億速云 閱讀:128 作者:小新 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)Java內(nèi)存數(shù)據(jù)區(qū)域的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

思維導(dǎo)圖

Java內(nèi)存數(shù)據(jù)區(qū)域的示例分析

總共也就這么 5 個區(qū)(直接內(nèi)存不屬于 JVM 運行時數(shù)據(jù)區(qū)的一部分),除了程序計數(shù)器其他的地方都有可能出現(xiàn) OOM (OutOfMemoryError),其中像是程序計數(shù)器和兩個棧(Java 虛擬機棧 & 本地方法棧)都是每個線程要有一個的,所以肯定是線程隔離的。而其他 2 個區(qū)就是線程共享的了,也就是說,如果有多個線程要同時訪問這兩個區(qū)的數(shù)據(jù),是會出現(xiàn)線程安全問題的。接下來,我們將對這些區(qū)域進行詳細(xì)的介紹。

程序計數(shù)器

  • 當(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è)置成相同的值可避免堆自動擴展。


方法區(qū)

  • 存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù);

    • 類信息:即 Class 類,如類名、訪問修飾符、常量池、字段描述、方法描述等。

  • 垃圾收集行為在此區(qū)域很少發(fā)生;

    • 不過也不能不清理,對于經(jīng)常動態(tài)生成大量 Class 的應(yīng)用,如 Spring 等,需要特別注意類的回收狀況。

  • 運行時常量池也是方法區(qū)的一部分;

    • Class 文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項是常量池,用于存放編譯器生成的各種字面量(就是代碼中定義的 static final 常量)和符號引用,這部分信息就存儲在運行時常量池中。

  • 可能拋出的異常:

    • OutOfMemoryError(方法區(qū)無法滿足內(nèi)存分配需求時)。

直接內(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é)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(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)容。

AI