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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java内存溢出及解决:OutOfMemoryError 和 StackOverflowError

發布時間:2024/3/24 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java内存溢出及解决:OutOfMemoryError 和 StackOverflowError 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、OutOfMemoryError 和 StackOverflowError

1??堆區域用來存放 Class 的實例(即對象),對象需要存儲的內容主要是非靜態屬性。每次用 new 創建一個對象實例后,對象實例存儲在堆區域中,這部分空間也被 JVM 的垃圾回收機制管理。

【Java 堆內存溢出】java.lang.OutOfMemoryError:java heap space最常見,一般由于內存泄露或者堆的大小設置不當引起。原因是 JVM 創建的對象太多,在進行垃圾回收之間,虛擬機分配的到堆內存空間已經用滿了,與 Heap space 有關。解決這類問題有兩種思路:

  • 對于內存泄露,可以通過內存監控軟件查找程序中的泄露代碼。檢查程序,看是否有死循環或不必要地重復創建大量對象。找到原因后,修改程序和算法。
  • 增加 JVM 中 Xms(初始堆大小)和 Xmx(最大堆大小)參數的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m
  • 2??Java 棧跟大多數編程語言包括匯編語言的棧功能相似,主要基本類型變量以及方法的輸入輸出參數。

    【Java 棧內存溢出】java.lang.StackOverflowError也比較常見。Java 棧溢出,一般是由于程序中存在死循環或者深度遞歸調用造成的,棧大小設置太小也會出現此種溢出。可以通過虛擬機參數-Xss來設置棧的大小。

    二、Java 運行時數據區(Runtime Data Area)

    Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域,即運行時數據區(Runtime Data Area):

  • 【程序計數器】《Java虛擬機規范》中唯 一一個沒有規定任何OutOfMemoryError情況的區域。
  • 【Java虛擬機棧】《Java虛擬機規范》對該區域規定了兩類異常狀況:如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError;如果Java虛擬機棧容量可以動態擴展,當棧擴展時無法申請到足夠的內存會拋出OutOfMemoryError。
  • 【本地方法棧】與虛擬機棧一樣,也會在棧深度溢出或者棧擴展失敗時分別拋出StackOverflowError和OutOfMemoryError。
  • 【Java堆】既可以被實現成固定大小的,也可以是可擴展的,不過當前主流的Java虛擬機都是按照可擴展來實現的通過參數-Xmx和-Xms設定。如果Java堆中沒有內存完成實例分配,并且堆也無法再擴展時,Java虛擬機將會拋出OutOfMemoryError。
  • 【方法區】《Java虛擬機規范》規定,如果方法區無法滿足新的內存分配需求時,將拋出OutOfMemoryError。
  • 三、常見場景

    1??靜態集合類聲明為靜態static的HashMap、Vector 等集合。通俗來講A中有B,當前只把B設置為空,A沒有設置為空,回收時B無法被回收,因為被A引用。
    2??物理連接:DataSource.getConnection()建立鏈接,必須通過close()關閉鏈接。
    3??內部類和外部模塊等的引用
    GC只會回收沒有被引用或者根集不可到達的對象(取決于 GC 算法),內部類在生命周期內始終持有外部類的對象的引用,造成外部類的對象始終不滿足 GC 的回收條件,反映在內存上就是內存泄露。常見解決方案:

  • 將內部類定義為static
  • 用static的變量引用匿名內部類的實例或將匿名內部類的實例化操作放到外部類的靜態方法中
  • 4??【OutOfMemoryError:unable to create new native thread】Executors 返回的線程池對象的弊端如下:

  • FixedThreadPool 和 SingleThreadPool:
    允許的請求隊列長度為 Integer.MAX_VALUE,可能會堆積大量的請求,從而導致 OOM。
  • CachedThreadPool 和 ScheduledThreadPool:
    允許的創建線程數量為 Integer.MAX_VALUE,可能會創建大量的線程,從而導致 OOM。
  • 四、分析定位

    1??在未明確找到問題原因前,先添配置 JVM 啟動參數,監控復原 OOM 場景自動dump:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目錄}

    2??

  • 獲取內存的堆信息jmap -dump:format=b,file=mem.dat pid
  • 使用內存映像分析工具(如Eclipse Memory Analyzer)對 dump 出來的堆轉存快照進行分析,重點是確認內存中的對象是否是必要的,先分清是因為內存泄漏(Memory Leak)還是內存溢出(Memory Overflow)。
  • 看分析圖,查找對應問題,分析內存占用情況。例如:localstore 存儲問題分析,大對象。
  • 總結

    以上是生活随笔為你收集整理的Java内存溢出及解决:OutOfMemoryError 和 StackOverflowError的全部內容,希望文章能夠幫你解決所遇到的問題。

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