想要減少GC的頻率和Full GC的次數可以從以下幾方面著手:
合理的設定新生代和老年代空間大小
下面來詳細說說這三個方面怎麼做。
1、合理的設定新生代和老年代空間大小
一般來說,按照老年代:新生代=2:1,新生代中的Eden:from=8:1來配置,可以滿足大多數場景下的要求。
以一個4G記憶體的JVM為例,可以按照下面的引數來配置:
2、選擇合適的垃圾收集器
JVM中提供多種垃圾收集器,如果是後臺程式,追求垃圾回收佔用的時間比例儘可能小,推薦使用ParallelGC收集器,可用以下引數設定:
如果是web應用,追求儘可能短的停頓時間,建議用ParNew+CMS收集器,可用以下引數來配置:
3、避免記憶體洩露
如果程式中出現了記憶體洩漏,垃圾無法回收,不僅會頻繁出發GC,甚至會導致整個系統由於記憶體不足崩潰。
如果程式中出現了頻繁GC,最好看下GC日誌和dump檔案,確認有沒有記憶體洩漏。如果有的話必須先解決洩露問題。
想要減少GC的頻率和Full GC的次數可以從以下幾方面著手:
合理的設定新生代和老年代空間大小
選擇合適的垃圾收集器避免記憶體洩漏下面來詳細說說這三個方面怎麼做。
1、合理的設定新生代和老年代空間大小
一般來說,按照老年代:新生代=2:1,新生代中的Eden:from=8:1來配置,可以滿足大多數場景下的要求。
以一個4G記憶體的JVM為例,可以按照下面的引數來配置:
-server-Xms4096m-Xmx4096m-XX:NewSize=1536m-XX:MaxNewSize=1536m-XX:PermSize=64m-XX:MaxPermSize=64m-XX:+UseConcMarkSweepGC-XX:+CMSClassUnloadingEnabled-XX:MaxTenuringThreshold=52、選擇合適的垃圾收集器
JVM中提供多種垃圾收集器,如果是後臺程式,追求垃圾回收佔用的時間比例儘可能小,推薦使用ParallelGC收集器,可用以下引數設定:
-XX:+UseParallelGC如果是web應用,追求儘可能短的停頓時間,建議用ParNew+CMS收集器,可用以下引數來配置:
-XX:+UseParNewGC-XX:+UseConcMarkSweepGC3、避免記憶體洩露
如果程式中出現了記憶體洩漏,垃圾無法回收,不僅會頻繁出發GC,甚至會導致整個系統由於記憶體不足崩潰。
如果程式中出現了頻繁GC,最好看下GC日誌和dump檔案,確認有沒有記憶體洩漏。如果有的話必須先解決洩露問題。