成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JVM優化:實戰OutOfMemoryError異常

開發 前端
由于HotSpot虛擬機中并不區分虛擬機棧和本地方法棧, 因此對于HotSpot來說, -Xoss參數(設置本地方法棧大 小) 雖然存在, 但實際上是沒有任何效果的, 棧容量只能由-Xss參數來設定。

一、Java堆溢出

堆內存中主要存放對象、數組等,只要不斷地創建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過最大堆容量時,就會產生 OutOfMemoryError 的異常。堆 內存異常示例如下:

運行后會報異常,在堆棧信息中可以看到

java.lang.OutOfMemoryError: Java heap space 的信息,說明在堆內存空間產生內存溢出的異常。

新產生的對象最初分配在新生代,新生代滿后會進行一次 Minor GC ,如果 Minor GC 后空間不足會把該對象和 新生代滿足條件的對象放入老年代,老年代空間不足時會進行 Full GC ,之后如果空間還不足以存放新對象則拋 出 OutOfMemoryError 異常。

常見原因:

  •  內存中加載的數據過多,如一次從數據庫中取出過多數據;
  • 集合對對象引用過多且使用完后沒有清空;
  • 代碼中存在死循環或循環產生過多重復對象;
  • 堆內存分配不合理

二、虛擬機棧和本地方法棧溢出

由于HotSpot虛擬機中并不區分虛擬機棧和本地方法棧, 因此對于HotSpot來說, -Xoss參數(設置本地方法棧大 小) 雖然存在, 但實際上是沒有任何效果的, 棧容量只能由-Xss參數來設定。 關于虛擬機棧和本地方法棧, 在 《Java虛擬機規范》 中描述了兩種異常:

1) 如果線程請求的棧深度大于虛擬機所允許的最大深度, 將拋出StackOverflowError異常。

2) 如果虛擬機的棧內存允許動態擴展, 當擴展棧容量無法申請到足夠的內存時, 將拋出 OutOfMemoryError異 常。

《Java虛擬機規范》 明確允許Java虛擬機實現自行選擇是否支持棧的動態擴展, 而HotSpot虛擬機的選擇是不支持 擴展, 所以除非在創建線程申請內存時就因無法獲得足夠內存而出現 OutOfMemoryError異常, 否則在線程運行時 是不會因為擴展而導致內存溢出的, 只會因為棧容量無法容納新的棧幀而導致StackOverflowError異常。

為了驗證 這點, 我們可以做兩個實驗, 先將實驗范圍限制在單線程中操作, 嘗試下面兩種行為是 否能讓HotSpot虛擬機產 生OutOfMemoryError異常: 使用-Xss參數減少棧內存容量。 結果: 拋出StackOverflowError異常, 異常出現時輸出 的堆棧深度相應縮小。 定義了大量的本地變量, 增大此方法幀中本地變量表的長度。 結果: 拋出 StackOverflowError異常, 異常出現時輸出的堆棧深度相應縮小。

三、 運行時常量池和方法區溢出

由于運行時常量池是方法區的一部分, 所以這兩個區域的溢出測試可以放到一起進行。前面曾經提到HotSpot從 JDK 7開始逐步“去永久代”的計劃, 并在JDK 8中完全使用元空間來代替永久代的背景故事, 在此我們就以測試代碼 來觀察一下, 使用“永久代”還是“元空間”來實現方法區, 對程序有什么 實際的影響。

String::intern()是一個本地方法, 它的作用是如果字符串常量池中已經包含一個等于此String對象的 字符串, 則返 回代表池中這個字符串的String對象的引用; 否則, 會將此String對象包含的字符串添加到常量池中, 并且返回此 String對象的引用。 在JDK 6或更早之前的HotSpot虛擬機中, 常量池都是分配在永久代中, 我們可以通過-XX: PermSize和-XX: MaxPermSize限制永久代的大小, 即可間接限制其中常量池的容量。

方法區內存溢出

方法區的其他部分的內容, 方法區的主要職責是用于存放類型的相關信息, 如類名、 訪問修飾符、 常量池、 字段 描述、 方法描述等。 對于這部分區域的測試, 基本的思路是運行時產生大量的類去填滿方法區, 直到溢出為止。

四、直接內存溢出

直接內存(Direct Memory) 的容量大小可通過-XX: MaxDirectMemorySize參數來指定, 如果不去指定, 則默認與 Java堆最大值(由-Xmx指定) 一致, 越過了DirectByteBuer類直接通 過反射獲取Unsafe實例進行內存分配 (Unsafe類的getUnsafe()方法指定只有引導類加載器才會返回實例, 體現了設計者希望只有虛擬機標準類庫里面的 類才能使用Unsafe的功能,在JDK 10時才將Unsafe 的部分功能通過VarHandle開放給外部使用) ,

因為雖然使用 DirectByteBuer分配內存也會拋出內存溢出異常, 但它拋出異常時并沒有真正向操作系統申請分配內存, 而是通 過計算得知內存無法分配就會 在代碼里手動拋出溢出異常, 真正申請分配內存的方法是Unsafe::allocateMemory()。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2021-08-30 07:22:14

JVM OutOfMemory異常

2023-11-15 16:46:04

內存Java

2012-05-15 02:04:22

JVMJava

2012-03-01 10:51:37

JavaJVM

2023-08-04 08:53:42

2023-08-08 10:29:55

JVM優化垃圾回收

2010-09-26 10:02:09

JVM優化配置

2023-07-14 12:28:07

JVM優化操作

2023-10-12 22:35:08

2024-12-04 15:49:29

2024-12-04 16:44:51

2023-08-02 08:38:27

JVM加載機制

2011-11-28 10:50:56

JavaJVM優化

2023-09-01 08:59:57

2017-03-29 14:44:20

網絡性能優化

2022-05-17 09:02:30

前端性能優化

2009-04-20 08:51:50

MySQL查詢優化數據庫

2019-12-13 10:25:08

Android性能優化啟動優化

2010-09-27 13:33:26

JVM異常

2016-10-31 19:41:29

Java垃圾回收
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美激情国产精品 | 国产精品一区二区欧美黑人喷潮水 | 黄色香蕉视频在线观看 | 日韩图区| 高清18麻豆 | 中文字幕在线二区 | 99中文字幕| 国产欧美日韩一区 | 成人亚洲精品久久久久软件 | 日韩在线播放网址 | 国产精品成人一区二区三区夜夜夜 | 天天综合永久 | 91精品国产一区二区三区香蕉 | 国产欧美一区二区三区在线看 | 亚洲v日韩v综合v精品v | 精品国产乱码久久久久久丨区2区 | 九九亚洲| 五月激情婷婷网 | 亚洲精品视频一区 | 波多野结衣先锋影音 | 日韩免费网站 | 欧美日韩国产一区二区三区 | 特黄色一级毛片 | 91精品国产日韩91久久久久久 | 欧美精品video | 国产精品国产a | 在线精品一区二区 | 亚洲成av人片在线观看无码 | 美女天堂 | 欧区一欧区二欧区三免费 | 亚洲国产视频一区 | 国产一区在线免费观看视频 | 成人av网站在线观看 | 成年免费视频 | 99视频网 | 丁香久久| 在线观看亚洲 | 欧美日韩一 | 超碰电影 | 国产福利视频导航 | 亚洲成人一区 |