深入理解java虛擬機 摘要(三)--實戰(zhàn):OutOfMemoryError異常

深入理解java虛擬機 摘要


目錄:
一、自動內(nèi)存管理機制

  1. 運行時數(shù)據(jù)區(qū)域
  2. HotSpot虛擬機對象探秘
  3. 實戰(zhàn):OutOfMemoryError異常
  4. 垃圾收集器與內(nèi)存分配策略

一、自動內(nèi)存管理機制


3. 實戰(zhàn):OutOfMemoryError異常

  • Java堆溢出:

    測試代碼:

    public class Tests {
       static class Obj{
       }
    
       public static  void  main(String[] args) throws >Exception   {
           List<Obj> list = new ArrayList<>();
           while (true){
               list.add(new Obj());
           }
       }
    }   
    

    啟動參數(shù):

    -Xmx20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
    

    將堆的最小值-Xms參數(shù)與最大值-Xmx參數(shù)設(shè)置為一樣即可避免堆自動擴展潦蝇,通過參數(shù)-XX:+HeapDumpOnOutOfMemoryError可以讓虛擬機在出現(xiàn)內(nèi)存溢
    出異常時Dump出當(dāng)前的內(nèi)存堆轉(zhuǎn)儲快照以便事后進行分析

    要解決這個區(qū)域的異常而柑,一般的手段是先通過內(nèi)存映像分析工具
    ideal可使用JProfiler和JMeter插件進行分析

  • 虛擬機棧和本地方法棧溢出

    測試代碼:

    public static class JavaVMStackSOF {
       private int stackLength = 1;
    
       public void stackLeak() {
           stackLength++;
           stackLeak();
       }
    }
    
       public static void main(String[]args)throws Throwable{
           JavaVMStackSOF oom=new JavaVMStackSOF();
           try{
               oom.stackLeak();
           }catch(Throwable e){
               System.out.println("stack length:"+oom.stackLength);
               throw e;
           }
       }
    

    啟動參數(shù):

    -Xss20m
    

    對于HotSpot來說节芥,雖然-Xoss參數(shù)(設(shè)置本地方法棧大小)存在恐锦,但實際上是無效的滑燃,棧容量只由-Xss參數(shù)設(shè)定
    如果線程請求的棧深度大于虛擬機所允許的最大深度曲横,將拋出StackOverflowError異常。

    如果虛擬機在擴展棧時無法申請到足夠的內(nèi)存空間不瓶,則拋出OutOfMemoryError異常。

    這里把異常分成兩種情況灾杰,看似更加嚴(yán)謹(jǐn)蚊丐,但卻存在著一些互相重疊的地方:當(dāng)棧空間無法繼續(xù)分配時艳吠,到底是內(nèi)存太小麦备,還是已使用的棧空間太大,其本質(zhì)上只是對同一件事情的兩種描述而已凛篙。

    在單個線程下黍匾,無論是由于棧幀太大還是虛擬機棧容量太小,當(dāng)內(nèi)存無法分配的時候呛梆,虛擬機拋出的都是StackOverflowError異常锐涯。

  • 本機直接內(nèi)存溢出

    DirectMemory容量可通過-XX:MaxDirectMemorySize指定,如果不指定填物,則默認與Java堆最大值(-Xmx指定)一樣

    測試代碼:

    public class Tests {
      private static final Long MB=1024L*1024L;
      public static void main(String[]args)throws Exception{
          Field unsafeField=Unsafe.class.getDeclaredFields()[0];
          unsafeField.setAccessible(true);
          Unsafe unsafe=(Unsafe)unsafeField.get(null);
          while(true){
              unsafe.allocateMemory(MB);
          }
      }
    }
    

    啟動參數(shù):

    -Xss20m
    

    代碼解釋:
    越過了DirectByteBuffer類纹腌,直接通過反射獲取Unsafe實例進行內(nèi)存分配(Unsafe類的getUnsafe()方法限制了只有引導(dǎo)類加載器才會返回實例,也就是設(shè)計者希望只有rt.jar中的類才能使用Unsafe的功能)滞磺。因為升薯,雖然使用DirectByteBuffer分配內(nèi)存也會拋出內(nèi)存溢出異常,但它拋出異常時并沒有真正向操作系統(tǒng)申請分配內(nèi)存击困,而是通過計算得知內(nèi)存無法分配涎劈,于是手動拋出異常,真正申請分配內(nèi)存的方法是unsafe.allocateMemory()阅茶。

    由DirectMemory導(dǎo)致的內(nèi)存溢出趟妥,一個明顯的特征是在Heap Dump文件中不會看見明顯的異常,如果讀者發(fā)現(xiàn)OOM之后Dump文件很小坞生,而程序中又直接或間接使用了NIO英遭,那就可以考慮檢查一下是不是這方面的原因。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末企蹭,一起剝皮案震驚了整個濱河市白筹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谅摄,老刑警劉巖徒河,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異送漠,居然都是意外死亡顽照,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門闽寡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來代兵,“玉大人,你說我怎么就攤上這事爷狈≈灿埃” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵涎永,是天一觀的道長思币。 經(jīng)常有香客問我鹿响,道長,這世上最難降的妖魔是什么谷饿? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任惶我,我火速辦了婚禮,結(jié)果婚禮上博投,老公的妹妹穿的比我還像新娘绸贡。我一直安慰自己,他們只是感情好贬堵,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布恃轩。 她就那樣靜靜地躺著,像睡著了一般黎做。 火紅的嫁衣襯著肌膚如雪叉跛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天蒸殿,我揣著相機與錄音筷厘,去河邊找鬼。 笑死宏所,一個胖子當(dāng)著我的面吹牛酥艳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爬骤,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼充石,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了霞玄?” 一聲冷哼從身側(cè)響起骤铃,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坷剧,沒想到半個月后惰爬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡惫企,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年撕瞧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狞尔。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡丛版,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出偏序,到底是詐尸還是另有隱情硼婿,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布禽车,位于F島的核電站寇漫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏殉摔。R本人自食惡果不足惜州胳,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逸月。 院中可真熱鬧栓撞,春花似錦、人聲如沸碗硬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恩尾。三九已至弛说,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翰意,已是汗流浹背木人。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冀偶,地道東北人醒第。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像进鸠,于是被迫代替她去往敵國和親稠曼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容