JVM記憶體引數配置

2022-09-22 04:45:12 字數 3142 閱讀 4439

首先我們知道:jvm發生記憶體錯誤的型別

1、堆記憶體洩漏:outofmemory:j**a heap space

此種記憶體洩漏,增加記憶體,只能暫時解決問題,並不能**問題。必須要優化**,一定是**的問題:排查堆中的大量物件,就會發現,這些物件都被引用,物件不能及時被**,導致超出了堆的設定最大記憶體。

2、老年代記憶體洩漏:outofmemoryerror:permgen space

類名、訪問修飾符、字段描述、方法描述等,所佔空間大於永久代最大值,就會出現,一般都是初始化記憶體的時候,空間太小,解決辦法是擴大空間

3、棧記憶體洩漏:stackoverflowerror

**執行時,**進棧,此刻如果棧的記憶體不足以容納要進棧的**的大小空間,那麼久會報該錯誤。可以通過設定棧的空間大小。一般通過:-xss設定執行緒的大小來解決。比如:-xss256m

下面進入如何檢測jvm記憶體情況的實際操作:

1、監控jvm的gc情況

jstat -gcutil pid 2000 20 (只需要看o,如果達到100%,並且長期處於100%,則代表老年代記憶體不足)

pid:服務程序的pid,可通過:ps -ef | grep j**a 來檢視j**a的服務程序pid

2000:每隔多少秒進行監控一次。這裡是2秒

20: 總共獲取20次

e:eden區

o:老年代

p:永久代

ygc:新生代的gc次數

ygct:當前統計的ygc一共花費的時間(毫秒)

fgc:fullgc老年代的gc次數

fgct:當前統計的fgc一共花費的時間(毫秒)

gct:ygc+fgc

2、檢視jvm配置資訊

jmap -head pid  //可以看到j**a程序的堆的配置資訊,各區的空間大小和配置資訊

3、檢視jvm中類和物件的占用情況

jmap -histo 5279 | head -20  //檢視jvm中各個類的例項數、占用記憶體數量以及類的全名

4、上面使我們的基本命令使用,那麼我們怎麼**或者說記憶體洩漏會有什麼徵兆?

1、tps出現大幅波動,並慢慢降低,甚至降為0,響應時間隨之波動,慢慢公升高

2、通過jstat命令看到,jvm中old區不斷增加,fullgc非常頻繁,對應的fullgc消耗的時間也不斷增加

3、通過jconsole/jvisualvm可以看到,堆記憶體曲線不斷上公升,接近上限時,變成一條直線

4、日誌報錯j**a.lang.outofmemoryerror: j**a heap space

5、記憶體洩露怎麼定位?

(1、確定徵兆:現象方面,j**a程序丟擲oom異常,分析屬於那種異常,是正常的記憶體資源耗盡還是記憶體洩漏。

(2、監控jvm的gc情況:jstat -gcutil pid 1000 100(只需要看o,如果達到100%,並且長期處於100%,則代表老年代記憶體不足) 如果有大量的fgc就要查詢是否有記憶體洩漏的問題了

6、下面是進行最後的jvm引數調優:

vm常用引數

---------------------------------------

堆記憶體 = 年輕代+老年代

年輕代 = eden+survivor

survivor = from space+to space

---------------------------------------

年輕代 = eden+from space+to space

堆記憶體=eden+from space+to space+老年代

***********************************=

-xms2048m:初始堆大小,建議《物理記憶體的1/4,預設值為物理記憶體的1/64

-xmx2048m:最大堆大小,建議與-xms保持一致,預設值為物理記憶體的1/4

-xmn512m:新生代大小,建議不超過堆記憶體的1/2-xss256k,執行緒堆疊大小,建議256k

-xx:permsize=256m:永久代初始值,預設值為物理記憶體的1/64

-xx:maxpermsize=256m:永久代最大值,預設值為物理記憶體的1/4

-xx:survivorratio=8:年輕帶中eden區和survivor區的比例,預設為8:1,即eden(8),fromspace(1),tospace(1)

-xx:maxtenuringthreshold=15:晉公升到老年代的物件年齡,每個物件堅持過一次minorgc後物件年齡+1,預設值是15,年齡超過15進入到老年代,該引數在序列gc時有效-

xx:pretenuresizethreshold=3145728:單位位元組,只對serial和parnew兩款收集器有效,新生代採用parallel sc**enge gc時無效,大於這個值的物件直接在老年代進行分配

7、引數設定在**?

一般來說,乙個伺服器可能有多個j**a服務進行,對吧?是很多伺服器都會有這種情況,那麼問題來了,那我要是統一在jvm配置檔案修改jvm引數,那麼豈不是所有服務都是這個引數?所以有沒有其他辦法?

有!!!!那就是在j**a程序啟動命令設定。

nohup j**a $ -jar ***.jar 2>&1&

j**a_opt的引數:裡面引數自行看要設定什麼,以及具體的引數值

j**a_opt="-server -xms256m -xmx256m -xmn512m -xx:metaspacesize=64m -xx:maxmatespacesize=256m"

JVM記憶體配置引數

對於jvm記憶體配置引數 xmx10240m xms10240m xmn5120m xxsurvivorratio 3 其最小記憶體值和survivor區總大小分別是 5120m,1024m 5120m,2048m 10240m,1024m 10240m,2048m xmx10240m 代表最大堆 ...

JVM記憶體配置引數

對於jvm記憶體配置引數 xmx10240m xms10240m xmn5120m xxsurvivorratio 3 其最小記憶體值和survivor區總大小分別是 xms 設定堆的最小值 xmx 設定堆的最小值和最大值。xmn 設定了新生代的大小為5120m xxsurvivorratio 3 ...

JVM引數配置

xmsn 指定jvm堆的初始大小,預設為物理記憶體的1 64,最小為1m,可以指定單位k m,如不指定預設為 位元組 xmxn 指定jvm堆的最大值,預設為物理記憶體的1 4或1g,最小為2m,單位與 xms一致。xssn 設定單個執行緒棧的大小,預設為512k xincgc 開啟增量gc 預設為關...