Java運行時數據區域

運行時數據區域。
在這裏插入圖片描述

1、程序計數器
是一塊較小的內存空間。可看做當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型裏,字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。線程私有。執行Java方法計數器記錄的是正在執行的虛擬機字節碼指令的地址,執行Native方法,計數器值爲空。
此內存區域是唯一一個在Java虛擬機規範中沒有規定任何OutOfMemoryError情況的區域。
2、Java虛擬機棧
線程私有。生命週期與線程相同。Java虛擬機棧描述的是Java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀,用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。(棧內存,存放局部變量表包括八種基本數據類型和對象引用)
異常情況:(1)線程請求的棧深度大於虛擬機棧允許的深度,拋出StackOverflowError異常。
(2)如果虛擬機棧可以動態擴展,如果擴展時無法申請到足夠的內存,拋出OutOfMemoryError異常。
3、本地方法棧
與虛擬機棧作用相似,區別是虛擬機棧爲虛擬機執行Java方法也就是字節碼服務,而本地方法棧爲虛擬機使用到的Native方法服務。
異常情況:與虛擬機棧相同也會拋出StackOverflowError異常和OutOfMemoryError異常。
4、Java堆
所有線程共享的一塊內存區域。在虛擬機啓動時創建,存放對象實例。是垃圾收集器管理的主要區域。物理上可以處於不連續的內存空間中,只要邏輯上連續即可。
異常情況:如果在堆中沒有內存完成實例分配,並且堆也無法再擴展時,拋出OutOfMemoryError異常。
5、方法區
線程共享的一塊內存區域。用於存儲虛擬機加載的類信息、常量、靜態變量、幾十遍一期編譯後的代碼的數據。垃圾收集行爲在這個區域是比較少見的,這個區域的內存回收主要是針對常量池的回收和對類型的卸載。
異常情況:當方法區無法滿足內存分配需求時,拋出OutOfMemoryError異常。
6、運行時常量池
是方法區的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息就是運行時常量池。用於存放編譯期生成的各種字面量和符號引用。具有動態性。
異常情況:因爲是方法區的一部分所以收到方法區內存的限制,當常量池無法再申請到內存時會拋出拋出OutOfMemoryError異常。
7、直接內存
並不是虛擬機運行時數據區的一部分,也不是Java虛擬機規範中定義的內存區域,但是這部分內存被頻繁使用。也可以導致拋出OutOfMemoryError異常。jdk1.4中新加入了NIO類,一種基於通道與緩衝區的I/O方式,他可以使用Native函數庫直接分配堆外內存,然後通過一個儲存在Java堆中的DirectByteBuffer對象作爲這塊內存的引用進行操作。這樣能在一些場景中顯著提高性能,因爲避免了在Java堆和Native堆中來回複製數據。
異常情況:收到本機內存大小以及處理器尋址空間的限制。服務器管理員在配置虛擬機參數時,會根據實際內存設置-Xmx等參數信息,但是經常忽略直接內存,是的各個內存區域總和大於物理內存限制,從而導致動態擴展時出現OutOfMemoryError異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章