jvm記憶體溢位實踐

2022-09-12 03:18:10 字數 1558 閱讀 4060

參考

《深入理解j**a虛擬機器:jvm高階特性和最佳實踐》

public class heapoom 

public static void main(string args) }}

錯誤資訊提示「j**a.lang.outofmemoryerror: j**a heap space」

可以通過mat進行分析定位

exception in thread "main" j**a.lang.outofmemoryerror: unable to create native thread
不過對於64位的系統,程序記憶體上限達上百tb,不會出現上述的outofmemoryerror異常,但是可能會不斷侵占本地記憶體。在64位linux伺服器上嘗試了下,cpu基本佔滿,虛擬記憶體占用較多(54.3g),實際記憶體緩慢增長,開始記憶體增長快,後面速度降低,可能因為執行緒較多,主線程建立新執行緒的速度下降,看上去記憶體增長似乎很難達到伺服器上限,主要的問題應該還是集中在cpu占用上。

執行時常量池是方法區的一部分,但是jdk7以上將字串常量池移到了j**a堆中。以下**,如果在jdk6上執行,並且設定-xx: permsize=6m -xx: maxpermsize=6m時,會報outofmemoryerror: permgen space,即永久代(方法區)記憶體溢位;但是如果在jdk7及以上,字串常量池移到了j**a堆中,由於堆記憶體十分大,下面**的迴圈幾乎一直執行,但是如果設定-xmx為6mb,也會報outofmemoryerror: j**a heap space。

public class runtimeconstantpooloom }}

public class constantpool 

}

jdk7,方法區還由永久代實現,可以比較容易的出發方法區溢位,jdk8之後方法區由元空間實現,理論上僅受限於系統記憶體,同時可以實現垃圾**,很難出現方法區溢位。但是hotspot提供了若干防禦性引數避免元空間的任意使用。例如:

-xx:maxmetaspacesize:設定元空間最大值,預設是-1,即不限制,或者說只受限於本地記憶體大小。

-xx:metaspacesize:指定元空間的初始空間大小,以位元組為單位,達到該值就會觸發垃圾收集進行型別解除安裝,同時收集器會對該值進行調整:如果釋放了大量的空間,就適當降低該值;如果釋放了很少的空間,那麼在不超過-xx:maxmetaspacesize(如果設定了的話)的情況下,適當提高該值。

直接記憶體(directmemory)的容量大小可通過-xx:maxdirectmemorysize引數來指定,如果不去指定,則預設與j**a堆最大值(由-xmx指定)一致。由直接記憶體導致的記憶體溢位,乙個明顯的特徵是在heapdump檔案中不會看見有什麼明顯的異常情況,如果讀者發現記憶體溢位之後產生的dump檔案很小,而程式中又直接或間接使用了directmemory(典型的間接使用就是nio),那就可以考慮重點檢查一下直接記憶體方面的原因了。

JVM記憶體洩漏和記憶體溢位

相同與不同 如何避免記憶體洩漏 我們用棧來模擬,首先我們定義乙個我們自己的棧,如下圖所示 package com.zhuguang.allen public class stack 入棧 public void push object e 出棧 public object pop 假如沒有在出棧的時...

jvm 記憶體溢位,引發溢位原因排查

jvm 記憶體溢位,引發溢位原因排查 一 dump檔案分析 dump檔案獲取方式 1 設定jvm引數 xx heapdumponoutofmemoryerror xx heapdumppath tmp heapdump.hprof 記憶體溢位時產生dump檔案 2 使用jmap生成dump 檔案 d...

JVM學習(二) 記憶體溢位

1 j a物件無法被垃圾收集器 就會造成記憶體洩漏,記憶體洩漏越來越多就可能會導致記憶體溢位 j a.lang.outofmemoryerror 2 記憶體溢位有以下幾種情形 1 堆溢位 2 虛擬機器棧 本地方法棧 溢位 3 方法區 執行時常量池 溢位 4 直接記憶體溢位 3 常用jvm引數 1 x...