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