Java内存溢出及解决:OutOfMemoryError 和 StackOverflowError
一、OutOfMemoryError 和 StackOverflowError
1??堆區域用來存放 Class 的實例(即對象),對象需要存儲的內容主要是非靜態屬性。每次用 new 創建一個對象實例后,對象實例存儲在堆區域中,這部分空間也被 JVM 的垃圾回收機制管理。
【Java 堆內存溢出】java.lang.OutOfMemoryError:java heap space最常見,一般由于內存泄露或者堆的大小設置不當引起。原因是 JVM 創建的對象太多,在進行垃圾回收之間,虛擬機分配的到堆內存空間已經用滿了,與 Heap space 有關。解決這類問題有兩種思路:
2??Java 棧跟大多數編程語言包括匯編語言的棧功能相似,主要基本類型變量以及方法的輸入輸出參數。
【Java 棧內存溢出】java.lang.StackOverflowError也比較常見。Java 棧溢出,一般是由于程序中存在死循環或者深度遞歸調用造成的,棧大小設置太小也會出現此種溢出。可以通過虛擬機參數-Xss來設置棧的大小。
二、Java 運行時數據區(Runtime Data Area)
Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域,即運行時數據區(Runtime Data Area):
三、常見場景
1??靜態集合類聲明為靜態static的HashMap、Vector 等集合。通俗來講A中有B,當前只把B設置為空,A沒有設置為空,回收時B無法被回收,因為被A引用。
2??物理連接:DataSource.getConnection()建立鏈接,必須通過close()關閉鏈接。
3??內部類和外部模塊等的引用
GC只會回收沒有被引用或者根集不可到達的對象(取決于 GC 算法),內部類在生命周期內始終持有外部類的對象的引用,造成外部類的對象始終不滿足 GC 的回收條件,反映在內存上就是內存泄露。常見解決方案:
4??【OutOfMemoryError:unable to create new native thread】Executors 返回的線程池對象的弊端如下:
允許的請求隊列長度為 Integer.MAX_VALUE,可能會堆積大量的請求,從而導致 OOM。
允許的創建線程數量為 Integer.MAX_VALUE,可能會創建大量的線程,從而導致 OOM。
四、分析定位
1??在未明確找到問題原因前,先添配置 JVM 啟動參數,監控復原 OOM 場景自動dump:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目錄}
2??
總結
以上是生活随笔為你收集整理的Java内存溢出及解决:OutOfMemoryError 和 StackOverflowError的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 禁用windows10更新_如何在Win
- 下一篇: 五种聚类方法