国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

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

發(fā)布時(shí)間:2021-07-06 11:12 來(lái)源:腳本之家 閱讀:0 作者:唐宋xy 欄目: 開(kāi)發(fā)技術(shù)

目錄

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

堆內存溢出

java.lang.OutOfMemoryError: Java heap space

原因:

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

解決方案:

  • 查看當前JVM的堆內存配置是否太小,可以考慮增加堆內存大小

JAVA_OPTS="-server -Xms1024m -Xmx1024m"

表示將堆內存的初始值和最大值都設置為1024m

-Xms設置堆內存的初始值

-Xmx設置堆內存的最大值

-Xms和-Xmx最好設置相同的內存大小,可以防止因為JVM頻繁進(jìn)行內存的調整影響穩定性和使用

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

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

棧內存溢出

java.lang.outOfMemoryError:StackOverFlow Error

原因:

  • 線(xiàn)程請求的棧深度大于虛擬機允許的最大深度,拋出StackOverflowError
  • 虛擬機在擴展棧時(shí)無(wú)法申請到足夠的內存空間,拋出OutOfMemoryError

解決方案:

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

默認的-Xss參數的大小應該是1M

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

配置參數: JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xss128k"

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

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

方法區和運行時(shí)常量池內存溢出

java.lang.outOfMemoryError: PermGen space

原因:

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

解決方案:

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

運行時(shí)常量池是方法區的一部分,所以增加方法區的內存大小,相當于間接的增加了運行時(shí)常量池的內存大小

本機直接內存溢出

Direct buffer memory

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

原因:

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

解決方案:

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

元空間內存溢出

Metaspace

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

永久代、元空間都是方法區的實(shí)現,方法區是規范

原因:

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

解決方案:

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

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

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

国产SUV精二区69| 久久亚洲一区二区三区舞蹈| 无码人妻久久一区二区三区蜜桃| 色悠久久久久综合网伊| 亚洲免费在线观看| 天堂网www在线网|