亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中內(nèi)存問題之OOM詳解

 更新時間:2023年08月22日 09:28:58   作者:ycfxhsw  
這篇文章主要介紹了Java中內(nèi)存管理的OOM詳解,OOM,全稱“Out?Of?Memory”,翻譯成中文就是“內(nèi)存用完了”,來源于java.lang.OutOfMemoryError,當JVM因為沒有足夠的內(nèi)存來為對象分配空間并且垃圾回收器也已經(jīng)沒有空間可回收時,就會拋出這個error,需要的朋友可以參考下

一. StackOverflowError

1.1 bug

public class StackOverflowErrorDemo {
    public static void main(String[] args) {
        javaKeeper();
    }
    private static void javaKeeper() {
        javaKeeper();
    }
}

JVM 虛擬機棧是有深度的,在執(zhí)行方法的時候會伴隨著入棧和出棧,上邊的方法可以看到,main 方法執(zhí)行后不停的遞歸,遲早把棧撐爆了

Exception in thread "main" java.lang.StackOverflowError
	at oom.StackOverflowErrorDemo.javaKeeper(StackOverflowErrorDemo.java:15)

1.2 原因分析

  • 無限遞歸循環(huán)調(diào)用(最常見原因),要時刻注意代碼中是否有了循環(huán)調(diào)用方法而無法退出的情況
  • 執(zhí)行了大量方法,導致線程??臻g耗盡
  • 方法內(nèi)聲明了海量的局部變量
  • native 代碼有棧上分配的邏輯,并且要求的內(nèi)存還不小,比如 java.net.SocketInputStream.read0 會在棧上要求分配一個 64KB 的緩存(64位 Linux)

1.3 解決方案

  • 修復引發(fā)無限遞歸調(diào)用的異常代碼, 通過程序拋出的異常堆棧,找出不斷重復的代碼行,按圖索驥,修復無限遞歸 Bug
  • 排查是否存在類之間的循環(huán)依賴(當兩個對象相互引用,在調(diào)用toString方法時也會產(chǎn)生這個異常)
  • 通過 JVM 啟動參數(shù) -Xss 增加線程棧內(nèi)存空間, 某些正常使用場景需要執(zhí)行大量方法或包含大量局部變量,這時可以適當?shù)靥岣呔€程棧空間限制

二. Java heap space

Java 堆用于存儲對象實例,我們只要不斷的創(chuàng)建對象,并且保證 GC Roots 到對象之間有可達路徑來避免 GC 清除這些對象,那隨著對象數(shù)量的增加,總?cè)萘坑|及堆的最大容量限制后就會產(chǎn)生內(nèi)存溢出異常。

Java 堆內(nèi)存的 OOM 異常是實際應用中最常見的內(nèi)存溢出異常。

2.1 bug

/** * JVM參數(shù)&#xff1a;-Xmx12m */public class JavaHeapSpaceDemo {<!-- -->    static final int SIZE &#61; 2 * 1024 * 1024;    public static void main(String[] a) {<!-- -->        int[] i &#61; new int[SIZE];    }}

代碼試圖分配容量為 2M 的 int 數(shù)組,如果指定啟動參數(shù) -Xmx12m ,分配內(nèi)存就不夠用,就類似于將 XXXL 號的對象,往 S 號的 Java heap space 里面塞。

/**
 * JVM參數(shù):-Xmx12m
 */
public class JavaHeapSpaceDemo {
    static final int SIZE = 2 * 1024 * 1024;
    public static void main(String[] a) {
        int[] i = new int[SIZE];
    }
}

2.2 原因分析

  • 請求創(chuàng)建一個超大對象,通常是一個大數(shù)組
  • 超出預期的訪問量/數(shù)據(jù)量,通常是上游系統(tǒng)請求流量飆升,常見于各類促銷/秒殺活動,可以結(jié)合業(yè)務流量指標排查是否有尖狀峰值
  • 過度使用終結(jié)器(Finalizer),該對象沒有立即被 GC
  • 內(nèi)存泄漏(Memory Leak),大量對象引用沒有釋放,JVM 無法對其自動回收,常見于使用了 File 等資源沒有回收

2.3 解決方案

針對大部分情況,通常只需要通過 -Xmx 參數(shù)調(diào)高 JVM 堆內(nèi)存空間即可。如果仍然沒有解決,可以參考以下情況做進一步處理:

  • 如果是超大對象,可以檢查其合理性,比如是否一次性查詢了數(shù)據(jù)庫全部結(jié)果,而沒有做結(jié)果數(shù)限制
  • 如果是業(yè)務峰值壓力,可以考慮添加機器資源,或者做限流降級。
  • 如果是內(nèi)存泄漏,需要找到持有的對象,修改代碼設計,比如關(guān)閉沒有釋放的連接

內(nèi)存泄露和內(nèi)存溢出

內(nèi)存溢出(out of memory),是指程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用,出現(xiàn)out of memory;

比如申請了一個 Integer,但給它存了 Long 才能存下的數(shù),那就是內(nèi)存溢出。

內(nèi)存泄露( memory leak),是指程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很嚴重,無論多少內(nèi)存,遲早會被占光。

memory leak 最終會導致 out of memory!

到此這篇關(guān)于Java中內(nèi)存管理的OOM詳解的文章就介紹到這了,更多相關(guān)Java的OOM內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于jfreechart生成曲線、柱狀等圖片并展示到JSP

    基于jfreechart生成曲線、柱狀等圖片并展示到JSP

    這篇文章主要介紹了基于jfreechart生成曲線、柱狀等圖片并展示到JSP,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 解決Idea項目結(jié)構(gòu)顯示不全問題

    解決Idea項目結(jié)構(gòu)顯示不全問題

    文章描述了在使用IntelliJ IDEA時遇到的問題,并提出了解決方法:關(guān)閉IDEA、刪除項目中的.idea文件夾,然后重新打開IDEA導入項目
    2024-11-11
  • Java中ArrayList和SubList的坑面試題

    Java中ArrayList和SubList的坑面試題

    集合是Java開發(fā)日常開發(fā)中經(jīng)常會使用到的,下面這篇文章主要給大家介紹了關(guān)于Java中ArrayList和SubList的坑面試題,需要的朋友可以參考下
    2022-05-05
  • SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析

    SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析

    這篇文章主要為大家介紹了SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • autoMapping和autoMappingBehavior的區(qū)別及說明

    autoMapping和autoMappingBehavior的區(qū)別及說明

    這篇文章主要介紹了autoMapping和autoMappingBehavior的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • mybatis中批量更新多個字段的2種實現(xiàn)方法

    mybatis中批量更新多個字段的2種實現(xiàn)方法

    當我們使用mybatis的時候,可能經(jīng)常會碰到一批數(shù)據(jù)的批量更新問題,因為如果一條數(shù)據(jù)一更新,那每一條數(shù)據(jù)就需要涉及到一次數(shù)據(jù)庫的操作,本文主要介紹了mybatis中批量更新多個字段的2種實現(xiàn)方法,感興趣的可以了解一下
    2023-09-09
  • 關(guān)于idea剛打開時瘋狂報錯的問題

    關(guān)于idea剛打開時瘋狂報錯的問題

    這篇文章主要介紹了關(guān)于idea剛打開時瘋狂報錯的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • MyBatis框架搭建與代碼解讀分析

    MyBatis框架搭建與代碼解讀分析

    MyBatis是一個靈活的持久層框架,適合與數(shù)據(jù)庫交互,支持自定義SQL和高級映射,這篇文章給大家介紹MyBatis框架搭建與代碼解讀,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 詳解Spring的兩種代理方式:JDK動態(tài)代理和CGLIB動態(tài)代理

    詳解Spring的兩種代理方式:JDK動態(tài)代理和CGLIB動態(tài)代理

    這篇文章主要介紹了詳解Spring的兩種代理方式:JDK動態(tài)代理和CGLIB動態(tài)代理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • java的五種數(shù)據(jù)類型解析

    java的五種數(shù)據(jù)類型解析

    下面小編就為大家?guī)硪黄猨ava的五種數(shù)據(jù)類型解析。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05

最新評論