OutOFMemoryError
生活随笔
收集整理的這篇文章主要介紹了
OutOFMemoryError
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
版權聲明:本文為博主原創文章,未經博主允許不得轉載。http://www.cnblogs.com/jokermo/
注:本文屬于《深入理解java虛擬機》讀書筆記,想詳細了解請自行看書。
1.Java堆溢出
Java堆用于存儲對象實例,只要不斷創建對象,并且保證GC Roots到對象之間有可到達路徑來避免垃圾回收機制清除這些對象,那么對象數量達到容量限制后就會產生內存溢出異常。
import java.util.ArrayList; import java.util.List;/*** VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError* create by jokermo**/ public class HeapOOM {static class OOMObject{}public static void main(String[] args){List<OOMObject> list = new ArrayList<OOMObject>();while (true){list.add(new OOMObject());}} } 運行結果,其中java.lang.OutOfMemoryError:java heap space表示java堆內存溢出異常?
-Xms20m -Xmx20m:表示java堆大小為20M且不可擴展
解決Java堆異常:
- 首先通過內存映像分析工具(如Eclipse Memory Analyzer)對Dump出的堆存儲快照進行分析,主要是確認內存中的對象是否必須的,也就是確定屬于內存泄露(Momory Leak)還是內存溢出(Memory Overflow)
- 如果是內存泄露,可進一步通過工具查看泄露對象到GC Roots的引用鏈,掌握了泄露對象的類型信息及GC Roots引用鏈信息,就可以比較準確的定位出泄露代碼的位置。
- 如果是內存溢出(內存對象還必須活著)
2.虛擬機棧和本地方法棧溢出
虛擬機與本地方法區的兩種異常:
- 如果線程請求的棧深度大于虛擬機所運行的最大深度,將拋出StackOverflowError異常
- 如果虛擬機在擴展棧時無法申請到足夠的內存空間,將拋出OutOfMemoryError異常
拋出StackOverflowError異常,異常出現時輸出的棧深度相應縮小示例:
- 使用-XSS參數減少棧內存容量。
- 定義大量的本地變量,增大此方法幀中本地變量表的長度。
結果:
?
結果顯示:在單線程情況下,無論是由于棧幀太大還是虛擬機棧容量太小,當內存無法分配的時候,虛擬機拋出的都是StackOverflowError異常。
?
在多線程情況下,通過不斷創建線程可以產生內存溢出異常。
解決方法:
- 通過減少線程數或者更換64位的虛擬機。
- 若無法滿足上面條件,可以通過減小最大堆和減少棧容量來獲取更多線程。
?3.方法區和運行時常量池溢出
運行時常量池是方法區的一部分,方法區用于存放Class的相關信息,如類名、訪問修飾符、常量池、字段描述、方法描述等。
異常信息為permGen space
4.本機直接內存溢出
?
轉載于:https://www.cnblogs.com/jokermo/p/8978117.html
總結
以上是生活随笔為你收集整理的OutOFMemoryError的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 003 线程属性
- 下一篇: hdu5692【dfs序】【线段树】