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

溫馨提示×

溫馨提示×

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

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

JVM內存溢出怎么解決

發布時間:2021-12-27 16:56:34 來源:億速云 閱讀:173 作者:iii 欄目:開發技術

本篇內容介紹了“JVM內存溢出怎么解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

棧溢出(虛擬機棧和本地方法棧)

產生原因

  • 在HotSpot中,只能由-Xss參數來設定。因為在HotSpot中不區分虛擬機棧和本地方法棧的。

  • 棧溢出時會出現兩種異常:StackOverflowError異常和OutOfMemoryError異常。

    • StackOverflowError異常因為線程請求的棧深度大于虛擬機允許的最大深度。

    • OutOfMemoryError異常發生在虛擬機棧內存允許動態擴展的情況下,當擴展棧容量無法申請到足夠的內存時。

  • 因為HotSpot是不支持擴展的,所在除非在線程創建時申請內存無法滿足時,才會出現OutOfMemoryError,其余都是產生StackOverflowError異常。

  • 結論:給每個線程的棧分配內存不是越大越好。可以這么理解,比如總的內存是2G,如果一個線程就占了1.5G,那就。。。。

解決思路

出現 StackOverflowError異常時,會有明確錯誤堆棧可供分析,相對而言比較容易定位到問題所在。

如果使用Hotspot虛擬機默認參數,棧深度在大多數情況下(因為每個方法壓人棧的幀大小并不是一樣的,所以只能說大多數情況下)到達1000~2000 是完全沒有問題,對于正常的方法調用(包括不能做尾遞歸優化的遞歸調用),這個深度應該完全夠用了。但是,如果是建立過多線程導致的內存濫出,在不能減少線程數量或者更換 64 位虛擬機的情況下,就只能通過減少最大堆和減少棧容量來換取更多的線程。

堆溢出

產生原因

當不斷的創建對象并避免垃圾回收時,總容量觸及最大堆容量時,就會產生溢出。
運行代碼:設置vm參數-Xms10m -Xmx10m

public class HeapTest {
    static class OOMObj{

    }
    /**
     * vm arg -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError
     */

    public static void main(String[] args) {
        List<OOMObj> oomObjList = new ArrayList<OOMObj>();
        while (true){
            oomObjList.add(new OOMObj());
        }
    }
}

結果:

JVM內存溢出怎么解決

解決思路

首先通過內存映像分析工具確認是內存泄漏還是內存溢出。

  1. 如果是內存泄漏,說明導致OOM的對象不是必要的。進一步通過工具查看GC Roots引用鏈。一般可以比較精確的定位。

  2. 如果是內存溢出,對象是必須存活的,那就檢查虛擬機的堆參數-Xms、-Xmx設置,對比機器內存,看是否還有上調的空間。再從代碼上檢查對象生命周期、持有狀態時間、存儲結構是否有設計不合理等情況。

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

產生原因

一個類要被垃圾收集器回收,條件是比較苛刻的。在經常運行時生成大量動態類的應用場景里,就應該特別關注了。

解決思路

HotSpot在JDK8中已經完全使用元空間代替永久帶。Hotspot提供了一些參數作為元空間的防御措施,主要包括:

  1. XX:MaxMetaspacesize:設置元空間最大值,默認是-1,即不限制,或者說只受限于本地內存大小。

  2. -XX:Metaspacesize :指定元空間的初始空間大小,以宇節為單位,達到該值就會觸發垃圾收集進行類型卸載,同時收集器會對該值進行調整:如果釋放了大量的空間,就適當降低該值;如果釋放了很少的空間,那么在不超過-XX:MaxMetaspaceSize(如果設置了的話)的情況下,適當提高該值。

  3. -XX:MinMetaspace Free Ratio:作用是在垃圾收集之后控制最小的元空間剩余容量的百分比,可減少因為元空間不足導致的垃圾收集的頻率。類似的還有-xx:Max-MetaspaceFreeRatio,用于控制最大的元空間剩余容量的百分比。

本機直接內存溢出

產生原因

在直接或間接使用了ByteBuffer中的allocateDirect方法的時候,而不做clear的時候就會出現類似的問題。明顯的特征是在Heap Dump文件中不會看到明顯的異常情況。

解決思路

設置參數: -XX:MaxDirectMemorySize

“JVM內存溢出怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

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

jvm
AI

攀枝花市| 抚远县| 东港市| 手游| 安庆市| 渑池县| 晋江市| 广南县| 新津县| 恩施市| 九台市| 盘山县| 武隆县| 霍邱县| 阿克陶县| 苍梧县| 如东县| 平塘县| 文昌市| 台东县| 苏尼特左旗| 台南市| 新沂市| 罗江县| 达孜县| 买车| 大石桥市| 柳州市| 县级市| 呼和浩特市| 乐平市| 盘锦市| 阳原县| 英超| 资阳市| 兰州市| 成都市| 九龙坡区| 安溪县| 囊谦县| 大足县|