Java記憶體管理與記憶體溢出異常的詳解
下面小編就為大家帶來一篇淺談java記憶體管理與記憶體溢出異常。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧
說到記憶體管理,筆者這裡想先比較一下java與C、C++之間的差別:
在C、C++中,記憶體管理是由程式設計師負責的,也就是說程式設計師既要完成繁重的程式碼編寫工作又要時常考慮到系統記憶體的維護
在java中,程式設計師無需考慮記憶體的控制和維護,而是交由JVM自動管理,這樣就不容易出現記憶體洩漏和溢位的問題。然而,一旦出現記憶體洩漏和溢位方面的問題,如果不了解JVM的記憶體管理機制就很難找到錯誤所在。
1.JVM運行時資料區
#JVM在執行java程式的時候會將它所管理的記憶體劃分為若干個不同的區域,這些區域不僅有自己的用途,還有創建和銷毀的時間。一般來說包含以下幾個運行時資料區:
其中的橘色區域是各個執行緒私有的,即每個執行緒都會有自己的一份,而綠色區域是各個線程共享的。
2.java物件的建立
類別載入檢查
#當JVM掃描到new關鍵字時,首先會去檢查這個指令的參數是否能夠在常數池中定位到一個類別的符號引用,並且檢查這個類別的符號引用代表的類別是否已被載入、解析和初始化過。如果沒有,就必須先執行對應的類別載入過程。
記憶體分配當類別載入檢查通過後,JVM需要為新生物件分配內存,也就是把一塊確定大小的記憶體從java堆中劃分出來。常用的分割方法有兩種:
指標碰撞(要求堆記憶體絕對規則)、空閒清單(堆記憶體並不規整)。
記憶體初始化JVM需要將分配到的記憶體空間都初始化為零值(不包括物件頭),這就保證了物件的實例欄位在java程式碼中可以不賦初始值就直接使用,也就是說程式能夠存取這些欄位的資料型別所對應的零值。
物件初始化執行
3.物件的存取定位物件建立好了,我們也希望能夠快速的存取到這些對象,這就需要JVM堆疊上的reference(引用)資料來找到堆中的具體對象,而目前使用最多的存取方式有「
句柄方式」和「
直接指標」兩種。
4.記憶體溢出例外
JVM運行時資料區除了PC暫存器之外,其他的記憶體區域都有可能發生記憶體溢出的異常情況。 PC暫存器是唯一一個在JVM規範中沒有規定任何OutOfMemoryError(OOM)情況的區域。
堆溢出java中的堆用於儲存物件實例,如果不斷地建立對象,並且保證GC Roots到物件之間有可達路徑以避免GC的回收處理,那麼在物件的數量達到最大堆的容量限制後就會發生堆溢出的異常情況。
堆疊溢位(包括JVM堆疊和本機方法堆疊)
1.如果執行緒請求的堆疊深度大於JVM所允許的最大深度,將拋出StackOverflowError異常;
###2.如果JVM在擴充堆疊時無法申請到足夠的記憶體空間,將拋出OutOfMemoryError異常。 ######此外,還有方法區溢位、常數池溢位、本機記憶體溢位等等。 ###以上是Java記憶體管理與記憶體溢出異常的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

本站9月3日消息,韓媒etnews當地時間昨報道稱,三星電子和SK海力士的「類HBM式」堆疊結構行動記憶體產品將在2026年後實現商業化。消息人士表示這兩大韓國記憶體巨頭將堆疊式行動記憶體視為未來重要收入來源,並計劃將「類HBM記憶體」擴展到智慧型手機、平板電腦和筆記型電腦中,為端側AI提供動力。綜合本站先前報導,三星電子的此類產品叫做LPWideI/O內存,SK海力士則將這方面技術稱為VFO。兩家企業使用了大致相同的技術路線,即將扇出封裝和垂直通道結合在一起。三星電子的LPWideI/O內存位寬達512

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處
