02.內存區域與內存溢出異常

運行時數據區域

內存分類

  • 堆,存儲對象實例。

  • 棧(虛擬器棧、本地方法棧),存儲對象引用、局部變量、基本數據類型等等。

  • 方法區,“永久代”,存儲類信息、靜態變量、常量、編譯後代碼等等。

    • Class文件常量池,用於存放編譯器生成的各種字面量和符號引用,這部分內容類加載後將存放在運行時常量池。
    • 運行時常量池,相比Class文件常量池具有動態性
  • 程序計數器,記錄當前線程執行字節碼的行號指示器,改變其值執行下一行字節碼。

對象訪問

對象訪問方式

  • 使用句柄
  • 直接指針,HotSpot虛擬器使用,速度更快,省去一次指針定位時間。

OutOfMemoryError異常

Java堆溢出

判斷工具

內存映像分析工具。

判斷依據

對象是否必要,是則內存溢出,否則內存泄漏。

解決方法

增大物理內存大小,檢查是否存在某些對象生命週期過長持有狀態時間過長並嘗試減少程序運行時的內存損耗。

棧溢出

棧容量可用-Xss參數設定

異常描述
  • StackOverflowError,線程請求棧深度大於虛擬機允許的最大深度。
  • OutOfMemoryError,模擬器在擴展棧深度是無法申請到足夠的內存空間。
個人想法

(和上面有衝突,或者說是上面的定義不嚴格,存在交集):

StackOverflowError是縱向的,在一個線程內當無法有足夠內存是將會拋出的錯誤;

OutOfMemoryError是橫向層面的,如無法申請到足夠內存用於創建線程時,將會拋出此異常。

常量池溢出

參數設置

-XX:Permsize=10M

-XX:MaxPermsize=10M

String.intern()方法

若與該String對象的內容相等的字符串不存在於常量池,將會把該字符串添加到常量池,並返回該String對象的引用;否則直接返回該引用。

方法區溢出

參數設置

與常量池相同,常量池位於方法區。

出錯原因

運行時產生太多類填滿方法區。

本機直接內存溢出

參數設置

-XX:MaxDirectMemorySize=10M

默認與Java堆的最大值一樣

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