記錄JVM內存模型,參數含義和優化


一.JVM內存模型

(圖片來自網絡)

根據Java虛擬機規范,JVM將內存划分為:

  • New(年輕代)
  • Tenured(年老代)
  • Perm (永久代)

其中New和Tenured屬於堆內存,堆內存會從JVM啟動參數(-Xmx,-Xms,前者是JVM最大允許分配的堆內存,后者是JVM初始分配的堆內存)指定的內存中分配,Perm不屬於堆內存,由虛擬機直接分配,但可以通過-XX:PermSize -XX:MaxPermSize 等參數調整其大小。

  • 年輕代(New):年輕代用來存放JVM剛分配的Java對象
  • 年老代(Tenured):年輕代中經過垃圾回收沒有回收掉的對象將被Copy到年老代
  • 永久代(Perm):永久代存放Class、Method元信息,其大小跟項目的規模、類、方法的量有關,一般設置為128M就足夠,設置原則是預留30%的空間。

New又分為幾個部分:

  • Eden:Eden用來存放JVM剛分配的對象
  • Survivor1
  • Survivro2:兩個Survivor空間一樣大,當Eden中的對象經過垃圾回收沒有被回收掉時,會在兩個Survivor之間來回Copy,當滿足某個條件,比如Copy次數,就會被Copy到Tenured。顯然,Survivor只是增加了對象在年輕代中的逗留時間,增加了被垃圾回收的可能性。

二.JVM常見配置

如果想查看JVM的配置參數,可以采用如下方式:

  1. 啟動命令行,輸入java,然后回車,查看關於java的所有參數信息列表。(筆者使用windows系統,並且將JAVA_HOME添加進了環境變量。如果你輸入java顯示“

    'java' 不是內部或外部命令,也不是可運行的程序或批處理文件”,此時可以命令行進入jdk的安裝目錄的bin目錄下,再輸入java,回車)。效果如下圖所示:

  2. 上述參數列表中,有一個-X的參數,這個參數就是設置JVM虛擬機的,可以輸入java -X查看JVM設置的具體設置。效果如下圖所示:

上述參數並不是都常用,下面總結出常用的一些配置:

    1.堆配置:

  • -Xms:初始堆大小
  • -Xmx:最大堆大小(如果此值大於-Xms的大小,則按需分配,因此為了避免每次垃圾回收完成后JVM重新分配內存,兩個只很多時候設置成相同值)
  • -XX:NewSize=n:設置年輕代大小
  • -XX:NewRatio=n:設置年輕代和年老代的比值,如:n=3,表示年輕代和年老代比值是1:3
  • -XX:SurvivorRatio=m:年輕代中Eden區與兩個Survivor區的比值。注意Suvivor區有兩個,大小一樣大。如:m=3,表示Eden:Survivor=3:2,一個Survivor區占整個年輕代的1/5
  • XX:MaxPermSize=p:設置持久代的大小

    2.收集器設置

  • -XX:+UseSerialGC:設置串行收集器
  • -XX:+UseParallelGC:設置並行收集器
  • -XX:+UseParalledlOldGC:設置並行年老代收集器
  • -XX:+UseConcMarkSweepGC:設置並發收集器

    3.垃圾回收統計信息

  • -XX:+PrintGC
  • -XX:+PrintGCDetails
  • -XX:+PrintGCTimeStamps
  • -Xloggc:filename

    4.並行收集器設置

  • -XX:ParallelGCThreads=n:設置並行收集器收集時使用的CPU數。並行收集線程數。
  • -XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間
  • -XX:GCTimeRatio=n:設置垃圾回收時間占程序運行時間的百分比。公式為1/(1+n)

    5.並發收集器設置

  • -XX:+CMSIncrementalMode:設置為增量模式。適用於單CPU情況。
  • -XX:ParallelGCThreads=n:設置並發收集器年輕代收集方式為並行收集時,使用的CPU數。並行收集線程數。

三.留着補充

 

        

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com