天天看點

JVM-記憶體溢出、調優筆記前言1.堆記憶體溢出2. 永久代溢出3.棧記憶體溢出

前言

    首先預設大家知道新生代,老年代和永久代的概念,不懂的請自行百度。

1.堆記憶體溢出

    新生代+老年代 = 堆記憶體, (OutOfMemoryError:Java heap space) 是指堆溢出

    可以通過設定-Xms:1024m, -Xmx:2048,來設定堆記憶體大小,其中,-Xms:表示初始化堆大小,-Xmx:表示最大堆大小

2. 永久代溢出

    永久代溢出(OutOfMemoryError: PermGen space)可以分為兩種情況,第一種是常量池溢出,第二種是方法區溢出。可以通過設定-XX:PermSize = 512m, -XX:MaxPermSize=1024m,來改變永久代記憶體大小。

3.棧記憶體溢出

    一般遞歸容易引起棧記憶體溢出(StackOverflowError)

    -Xss:1m,表示每個線程堆棧的大小

常用法則1:

堆初始值和最大值設定為老年代的3~4倍

常用法則2:

永久代的初始值和最大值應該比永久代活躍資料大1.2~1.5倍

常用法則3:

新生代空間應該為老年代空間活躍資料的1~1.5倍

記憶體溢出常見原因:

棧記憶體溢出:程式所要求的棧深度過大。 

堆記憶體溢出: 厘清記憶體洩露還是 記憶體容量不足。洩露則看對象如何被 GC Root 引用,不足則通過調大-Xms,-Xmx參數。 

永久代溢出:Class對象未被釋放,Class對象占用資訊過多,有過多的Class對象。