日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OutOFMemoryError

發布時間:2024/9/5 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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引用鏈信息,就可以比較準確的定位出泄露代碼的位置。
  • 如果是內存溢出(內存對象還必須活著)
  • 查看虛擬機的堆參數(-Xmx 和-Xms),與機器物理內存對比是否還可以調大。
  • 從代碼上檢查是否存在某些對象生命周期過長,持有狀態過長的情況,嘗試減少程序運行期內存的消耗。
  • 2.虛擬機棧和本地方法棧溢出

    虛擬機與本地方法區的兩種異常:

    • 如果線程請求的棧深度大于虛擬機所運行的最大深度,將拋出StackOverflowError異常
    • 如果虛擬機在擴展棧時無法申請到足夠的內存空間,將拋出OutOfMemoryError異常

    拋出StackOverflowError異常,異常出現時輸出的棧深度相應縮小示例:

    • 使用-XSS參數減少棧內存容量。
    • 定義大量的本地變量,增大此方法幀中本地變量表的長度。
    /*** VM Args:-Xss128k* create by jokermo**/ public class JavaVMStackSOF {private int stackLength = 1;public void stackLeak(){stackLength++;stackLeak();}public static void main(String[] args){JavaVMStackSOF javaVMStackSOF = new JavaVMStackSOF();try {javaVMStackSOF.stackLeak();}catch (Throwable e){System.out.print("stack Length:" + javaVMStackSOF.stackLength);throw e;}} }

    結果:

    ?

    結果顯示:在單線程情況下,無論是由于棧幀太大還是虛擬機棧容量太小,當內存無法分配的時候,虛擬機拋出的都是StackOverflowError異常。

    ?

    在多線程情況下,通過不斷創建線程可以產生內存溢出異常。

    解決方法:

    • 通過減少線程數或者更換64位的虛擬機。
    • 若無法滿足上面條件,可以通過減小最大堆和減少棧容量來獲取更多線程。

    ?3.方法區和運行時常量池溢出

    運行時常量池是方法區的一部分,方法區用于存放Class的相關信息,如類名、訪問修飾符、常量池、字段描述、方法描述等。

    異常信息為permGen space

    4.本機直接內存溢出

    ?

    轉載于:https://www.cnblogs.com/jokermo/p/8978117.html

    總結

    以上是生活随笔為你收集整理的OutOFMemoryError的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。