中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java內存中出現OOM的原因有哪些

發布時間:2020-11-16 16:28:02 來源:億速云 閱讀:123 作者:Leah 欄目:編程語言

Java內存中出現OOM的原因有哪些?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

一,jvm內存區域

1,程序計數器

一塊很小的內存空間,作用是當前線程所執行的字節碼的行號指示器。

2,java棧

與程序計數器一樣,java棧(虛擬機棧)也是線程私有的,其生命周期與線程相同。通常存放基本數據類型,對象引用(一個指向對象起始地址的引用指針或一個代表對象的句柄),reeturnAddress類型(指向一條字節碼指令的地址)

棧區域有兩種異常類型:如果線程請求的棧深度大于虛擬機所允許的深度,將拋StrackOverflowError異常;如果虛擬機棧可以動態擴展(大部分虛擬機都可動態擴展),當擴展時無法申請到足夠的內存時會拋出OutOfMemoryError異常。

3,本地方法棧

與虛擬機棧作用很相似,區別是虛擬機棧為虛擬機執行java方法服務,而本地方法棧則是為虛擬機用到的Native方法服務。和虛擬機棧一樣可能拋出StackOverflowError和OutOfMemoryError異常。

4,java堆

java Heap是jvm所管理的內存中最大的區域。JavaHeap是被所有線程共享的一塊內存區域,在虛擬機啟動時創建。主要存放對象實例。JavaHeap是垃圾收集器管理的主要區域,其可細分為新生代和老年代。如果在堆中沒有內存完成實例分配,并且也無法再擴展時,會拋出OutOfMemoryError異常。

5,方法區

與javaHeap一樣是各個線程共享的內存區域,用于存放已被虛擬機加載的類信息、常量、靜態變量、及時編譯器編譯后的代碼等數據。當方法區無法滿足內存分配的需求時,將拋出OutOfMemoryError異常。方法同時包含常聽說的運行時常量池,用于存放編譯期生成的各種字面量和符號引用。

6,直接內存

直接內存并不是虛擬機運行時數據區的一部分,也不是java虛擬機規范中定義的內存區域,是jvm外部的內存區域,這部分區域也可能導致OutOfMemoryError異常。

二,jvm參數

-Xss(StackSpace)棧空間

-Xms ,-Xmx(heap memory space)堆空間:Heap是大家最為熟悉的區域,他是jvm用來存儲對象實例的區域,Heap在32位的系統中最大為2G,其大小通過-Xms和-Xmx來控制,-Xms為jvm啟動時申請的最小Heap內存,默認為物理內存的1/64,但小于1G,-Xmx為jvm可申請的最大的Heap內存,默認為物理內存的1/4,一般也小于1G,默認當空余堆內存小于40%時,jvm會最大Heap的大小到-Xmx指定大小,可通過-XX:MinHeapFreeRatio來指定這個比例,當空余堆內存大于70%時,JVM會將Heap的大小往-Xms指定的大小調整,可通過-XX:MaxHeapFreeRatio來指定這個比例,但通常為了避免頻繁調整HeapSize的大小,將-Xms和-Xmx的值設為相同。

-XX:PermSize  -XX:MaxPermSize :方法區持久代大小: 方法區域也是全局共享的,在一定的條件下它也會被   GC ,當方法區域需要使用的內存超過其允許的大小時,會拋出   OutOfMemory 的錯誤信息。

三,常見內存溢出錯誤解決辦法

除了程序計數器外,虛擬機內存的其他幾個運行時區域都有發生OutOfMemoryError(OOM)異常的可能,

1,Java Heap 溢出

一般的異常信息:java.lang.OutOfMemoryError:Java heap spacess

java堆用于存儲對象實例,我們只要不斷的創建對象,并且保證GC Roots到對象之間有可達路徑來避免垃圾回收機制清除這些對象,就會在對象數量達到最大堆容量限制后產生內存溢出異常。

出現這種異常,一般手段是先通過內存映像分析工具(如Eclipse Memory Analyzer)對dump出來的堆轉存快照進行分析,重點是確認內存中的對象是否是必要的,先分清是因為內存泄漏(Memory Leak)還是內存溢出(Memory Overflow)。

如果是內存泄漏,可進一步通過工具(如Jrockit等工具)查看泄漏對象到GC Roots的引用鏈。于是就能找到泄漏對象時通過怎樣的路徑與GC Roots相關聯并導致垃圾收集器無法自動回收。

如果不存在泄漏,那就應該檢查虛擬機的參數(-Xmx與-Xms)的設置是否適當。

2,虛擬機棧和本地方法棧溢出

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

如果虛擬機在擴展棧時無法申請到足夠的內存空間,則拋出OutOfMemoryError異常

這里需要注意當棧的大小越大可分配的線程數就越少。

3,運行時常量池溢出

異常信息:java.lang.OutOfMemoryError:PermGen space

如果要向運行時常量池中添加內容,最簡單的做法就是使用String.intern()這個Native方法。該方法的作用是:如果池中已經包含一個等于此String的字符串,則返回代表池中這個字符串的String對象;否則,將此String對象包含的字符串添加到常量池中,并且返回此String對象的引用。由于常量池分配在方法區內,我們可以通過-XX:PermSize和-XX:MaxPermSize限制方法區的大小,從而間接限制其中常量池的容量。

4,方法區溢出

方法區用于存放Class的相關信息,如類名、訪問修飾符、常量池、字段描述、方法描述等。

異常信息:java.lang.OutOfMemoryError:PermGen space

方法區溢出也是一種常見的內存溢出異常,一個類如果要被垃圾收集器回收,判定條件是很苛刻的。在經常動態生成大量Class的應用中,要特別注意這點。

看完上述內容,你們掌握Java內存中出現OOM的原因有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

常德市| 蒙阴县| 历史| 石门县| 泰顺县| 东辽县| 宜兰市| 方正县| 微山县| 鲁山县| 云浮市| 文昌市| 周宁县| 正定县| 北京市| 申扎县| 罗山县| 呼伦贝尔市| 馆陶县| 大安市| 观塘区| 郁南县| 贵德县| 五莲县| 武强县| 拉孜县| 清流县| 马山县| 甘肃省| 高邮市| 开远市| 阿拉尔市| 沭阳县| 临城县| 凤城市| 天柱县| 百色市| 分宜县| 康马县| 中超| 兴和县|