運行時數據區域
內存分類
-
堆,存儲對象實例。
-
棧(虛擬器棧、本地方法棧),存儲對象引用、局部變量、基本數據類型等等。
-
方法區,“永久代”,存儲類信息、靜態變量、常量、編譯後代碼等等。
- Class文件常量池,用於存放編譯器生成的各種字面量和符號引用,這部分內容類加載後將存放在運行時常量池。
- 運行時常量池,相比Class文件常量池具有
動態性
。
-
程序計數器,記錄
當前線程
執行字節碼的行號指示器,改變其值執行下一行字節碼。
對象訪問
對象訪問方式
- 使用句柄
- 直接指針,HotSpot虛擬器使用,速度更快,省去一次指針定位時間。
OutOfMemoryError異常
Java堆溢出
判斷工具
內存映像分析工具。
判斷依據
對象是否必要
,是則內存溢出,否則內存泄漏。
解決方法
增大物理內存大小,檢查是否存在某些對象生命週期過長
、持有狀態時間過長
並嘗試減少程序運行時的內存損耗。
棧溢出
棧容量可用-Xss
參數設定
異常描述
StackOverflowError
,線程請求棧深度大於虛擬機允許的最大深度。OutOfMemoryError
,模擬器在擴展棧深度是無法申請到足夠的內存空間。
個人想法
(和上面有衝突,或者說是上面的定義不嚴格,存在交集):
StackOverflowError
是縱向的,在一個線程內當無法有足夠內存是將會拋出的錯誤;
OutOfMemoryErro
r是橫向層面的,如無法申請到足夠內存用於創建線程時,將會拋出此異常。
常量池溢出
參數設置
-XX:Permsize=10M
-XX:MaxPermsize=10M
String.intern()方法
若與該String對象的內容相等的字符串不存在於常量池,將會把該字符串添加到常量池,並返回該String對象的引用;否則直接返回該引用。
方法區溢出
參數設置
與常量池相同,常量池位於方法區。
出錯原因
運行時產生太多類填滿方法區。
本機直接內存溢出
參數設置
-XX:MaxDirectMemorySize=10M
默認與Java堆的最大值一樣