欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 常見(jiàn)的幾種內(nèi)存溢出異常的原因及解決

 更新時(shí)間:2021年04月25日 11:55:30   作者:唐宋xy  
這篇文章主要介紹了Java 常見(jiàn)的幾種內(nèi)存溢出異常及解決,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

內(nèi)存溢出的異常有很多,并且每種內(nèi)存溢出都會(huì)有不同的異常信息和解決方式,下面會(huì)列出常見(jiàn)的幾種內(nèi)存溢出異常

堆內(nèi)存溢出

java.lang.OutOfMemoryError: Java heap space

原因:

  • 當(dāng)堆內(nèi)存不足,并且已經(jīng)達(dá)到JVM設(shè)置的最大值,無(wú)法繼續(xù)申請(qǐng)新的內(nèi)存,存活的對(duì)象在堆內(nèi)存中無(wú)法被回收,那么就會(huì)拋出該異常,表示堆內(nèi)存溢出。
  • 當(dāng)一次從數(shù)據(jù)庫(kù)查詢大量數(shù)據(jù),堆內(nèi)存沒(méi)有足夠的內(nèi)存可以存放大量的數(shù)據(jù)
  • 大量的強(qiáng)引用對(duì)象在堆內(nèi)存中存活,GC無(wú)法回收這些對(duì)象,新創(chuàng)建的對(duì)象在新生代無(wú)法進(jìn)行分配,F(xiàn)ull GC仍然無(wú)法進(jìn)行回收

解決方案:

  • 查看當(dāng)前JVM的堆內(nèi)存配置是否太小,可以考慮增加堆內(nèi)存大小

JAVA_OPTS="-server -Xms1024m -Xmx1024m"

表示將堆內(nèi)存的初始值和最大值都設(shè)置為1024m

-Xms設(shè)置堆內(nèi)存的初始值

-Xmx設(shè)置堆內(nèi)存的最大值

-Xms和-Xmx最好設(shè)置相同的內(nèi)存大小,可以防止因?yàn)镴VM頻繁進(jìn)行內(nèi)存的調(diào)整影響穩(wěn)定性和使用

  • 查看代碼中是否有從數(shù)據(jù)庫(kù)中一次加載大量數(shù)據(jù)的情況,或者代碼中有大量強(qiáng)引用無(wú)法進(jìn)行回收

通過(guò)JVM參數(shù):-XX:+HeapDumpOnOutOfMemoryError可以讓虛擬機(jī)在出現(xiàn)內(nèi)存溢出的時(shí)候Dump出當(dāng)前的堆內(nèi)存快照,便于保留快照分析

棧內(nèi)存溢出

java.lang.outOfMemoryError:StackOverFlow Error

原因:

  • 線程請(qǐng)求的棧深度大于虛擬機(jī)允許的最大深度,拋出StackOverflowError
  • 虛擬機(jī)在擴(kuò)展棧時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存空間,拋出OutOfMemoryError

解決方案:

  • 檢查代碼是否出現(xiàn)深度遞歸的情況,或者遞歸的終止條件沒(méi)有設(shè)置
  • 如果是線程的棧內(nèi)存空間過(guò)小,則通過(guò)-Xss設(shè)置每個(gè)線程的棧內(nèi)存空間

默認(rèn)的-Xss參數(shù)的大小應(yīng)該是1M

棧內(nèi)存是線程私有的,如果需要?jiǎng)?chuàng)建更多的線程,那么就需要將每個(gè)線程的棧內(nèi)存空間減小,通過(guò)-Xss參數(shù)設(shè)置每個(gè)線程的棧內(nèi)存空間

配置參數(shù): JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xss128k"

jdk8如果沒(méi)有配置-Xss默認(rèn)大小為512k

-Xss 設(shè)置每個(gè)線程的堆棧大小,一般默認(rèn)512~1024kb,和jdk版本有關(guān)

方法區(qū)和運(yùn)行時(shí)常量池內(nèi)存溢出

java.lang.outOfMemoryError: PermGen space

原因:

  • 方法區(qū)存放的是Class的相關(guān)信息,如類名、訪問(wèn)修飾符、常量池、字段描述、方法描述等,內(nèi)存溢出的原因可能是加載的類過(guò)多導(dǎo)致方法區(qū)沒(méi)有足夠的內(nèi)存
  • 如果程序中大量使用cglib或者動(dòng)態(tài)代理等對(duì)目標(biāo)類進(jìn)行代理,那么在運(yùn)行時(shí)會(huì)生成大量的代理類,如Spring、Hibernate等框架。所以生成的代理類過(guò)多導(dǎo)致方法區(qū)沒(méi)有足夠的內(nèi)存

解決方案:

  • 減少?zèng)]有必要的Class加載,防止方法區(qū)內(nèi)存溢出并且減少程序的編譯時(shí)間
  • 通過(guò)JVM參數(shù)設(shè)置方法區(qū)的大小,-XX:PermSize和-XX:MaxPermSize設(shè)置方法區(qū)的大小

運(yùn)行時(shí)常量池是方法區(qū)的一部分,所以增加方法區(qū)的內(nèi)存大小,相當(dāng)于間接的增加了運(yùn)行時(shí)常量池的內(nèi)存大小

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

Direct buffer memory

Java 允許應(yīng)用程序通過(guò) DirectByteBuffer 直接訪問(wèn)堆外內(nèi)存,許多高性能程序通過(guò) DirectByteBuffer 結(jié)合內(nèi)存映射文件(Memory Mapped File)實(shí)現(xiàn)高速 IO

原因:

DirectByteBuffer 的默認(rèn)大小為 64 MB,一旦使用超出限制,就會(huì)拋出 Direct buffer memory 錯(cuò)誤。使用NIO則可能會(huì)出現(xiàn)該異常

解決方案:

DirectMemory的內(nèi)存大小可以通過(guò)-XX:MaxDirectMemorySize指定,如果沒(méi)有設(shè)置,則默認(rèn)和Java堆最大值(-Xmx)一樣

元空間內(nèi)存溢出

Metaspace

Jdk8 之后使用元空間(metaspace)代替永久代,元空間和永久代最大的區(qū)別是元空間的內(nèi)存使用的是本地內(nèi)存,而永久代使用的是JVM的內(nèi)存

永久代、元空間都是方法區(qū)的實(shí)現(xiàn),方法區(qū)是規(guī)范

原因:

元空間中存儲(chǔ)的是類信息、常量池、方法描述等信息,直接使用本地內(nèi)存,當(dāng)本地內(nèi)存不足的時(shí)候,會(huì)拋出OutOfMemoryError:Metaspace異常

解決方案:

雖然元空間的內(nèi)存不是由JVM控制,不過(guò)可以通過(guò)JVM參數(shù)來(lái)設(shè)置分配的內(nèi)存空間的大小-XX:MaxMetaspaceSize配置參數(shù)

以上就是Java 常見(jiàn)的幾種內(nèi)存溢出異常及解決的詳細(xì)內(nèi)容,更多關(guān)于Java 內(nèi)存溢出的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring源碼解析之BeanPostProcessor知識(shí)總結(jié)

    Spring源碼解析之BeanPostProcessor知識(shí)總結(jié)

    今天給大家?guī)?lái)的文章是Spring的相關(guān)知識(shí),文章圍繞著BeanPostProcessor的使用展開(kāi),文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

    Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

    這篇文章主要為大家詳細(xì)介紹了Spring控制反轉(zhuǎn)IoC入門使用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Java生成隨機(jī)姓名、性別和年齡的實(shí)現(xiàn)示例

    Java生成隨機(jī)姓名、性別和年齡的實(shí)現(xiàn)示例

    這篇文章主要介紹了Java生成隨機(jī)姓名、性別和年齡的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Spring Web零xml配置原理以及父子容器關(guān)系詳解

    Spring Web零xml配置原理以及父子容器關(guān)系詳解

    這篇文章主要介紹了Spring Web零xml配置原理以及父子容器關(guān)系詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Java JSch遠(yuǎn)程執(zhí)行Shell命令的方法

    Java JSch遠(yuǎn)程執(zhí)行Shell命令的方法

    本文主要介紹了Java JSch遠(yuǎn)程執(zhí)行Shell命令,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java logback日志的簡(jiǎn)單使用

    Java logback日志的簡(jiǎn)單使用

    這篇文章主要介紹了Java logback日志的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Java利用多線程模擬銀行系統(tǒng)存錢問(wèn)題

    Java利用多線程模擬銀行系統(tǒng)存錢問(wèn)題

    本文將利用Java多線程模擬銀行系統(tǒng)存錢問(wèn)題:使用兩個(gè)不同的線程向同一個(gè)賬戶存錢。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-08-08
  • OpenTelemetry初識(shí)及調(diào)用鏈Trace詳解

    OpenTelemetry初識(shí)及調(diào)用鏈Trace詳解

    這篇文章主要為為大家介紹了OpenTelemetry初識(shí)及調(diào)用鏈Trace詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 深入了解SpringBoot中@ControllerAdvice的介紹及三種用法

    深入了解SpringBoot中@ControllerAdvice的介紹及三種用法

    這篇文章主要為大家詳細(xì)介紹了SpringBoot中@ControllerAdvice的介紹及三種用法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-02-02
  • Java依賴注入容器超詳細(xì)全面講解

    Java依賴注入容器超詳細(xì)全面講解

    依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個(gè)概念。具體含義是:當(dāng)某個(gè)角色(可能是一個(gè)Java實(shí)例,調(diào)用者)需要另一個(gè)角色(另一個(gè)Java實(shí)例,被調(diào)用者)的協(xié)助時(shí),在 傳統(tǒng)的程序設(shè)計(jì)過(guò)程中,通常由調(diào)用者來(lái)創(chuàng)建被調(diào)用者的實(shí)例
    2023-01-01

最新評(píng)論