天天看點

JVM-常用記憶體調優參數總結

一、記憶體調整參數

-Xmx2g

  設定堆記憶體最大值為2g

-Xmx512m 

  設定堆記憶體最大值為512m

-Xms1g   

  設定堆記憶體最小值1g(ps:-Xms和-Xmx實際上是 -XX:InitialHeapSize 和

  -XX:MaxHeapSize 的縮寫。例如:-XX:InitialHeapSize=128m -XX:MaxHeapSize=2g )

-Xmn 

  設定堆新生代的大小,例如:-Xmn512m

-XX:PermSize(jdk7有,jdk8沒有)

  設定Perm Generation的最小值,例如:-XX:PermSize=32m

-XX:MaxPermSize(jdk7有,jdk8沒有)

  設定Perm Generation的最大值,例如:-XX:MaxPermSize=64m

-XX:MetaspaceSize(jdk8的參數)

  設定Metaspace的大小,預設值是21M,例如:-XX:MetaspaceSize=128M

-XX:MaxMetaspaceSize(jdk8的參數)

  這個參數用于限制Metaspace增長的上限,防止因為某些情況導緻Metaspace

  無限的使用本地記憶體,如果超過設定的值就會觸發Full GC,此值預設沒有限制,

  但應取決于系統記憶體的大小,JVM會動态地改變此值。例如:-XX:MaxMetaspaceSize=4096M

-XX:MinMetaspaceFreeRatio(jdk8的參數)

  當進行過Metaspace GC之後,會計算目前Metaspace的空閑空間比,如果空閑比

  小于這個參數,那麼虛拟機将增長Metaspace的大小。在本機該參數的預設值為40,

  也就是40%。設定該參數可以控制Metaspace的增長的速度,太小的值會導緻

  Metaspace增長的緩慢,Metaspace的使用逐漸趨于飽和,可能會影響之後類的加載。

  而太大的值會導緻Metaspace增長的過快,浪費記憶體。例如:-XX:MinMetaspaceFreeRatio=40

-XX:MaxMetasaceFreeRatio(jdk8的參數)

  當進行過Metaspace GC之後, 會計算目前Metaspace的空閑空間比,如果空閑比大于這個參數,

  那麼虛拟機會釋放Metaspace的部分空間。在本機該參數的預設值為70,也就是70% 

  例如:-XX:MaxMetasaceFreeRatio=70

-XX:MaxMetaspaceExpansion(jdk8的參數)

  Metaspace增長時的最大幅度。例如:-XX:MaxMetaspaceExpansion=5M

-XX:MinMetaspaceExpansion(jdk8的參數)

  Metaspace增長時的最小幅度。例如:-XX:MinMetaspaceExpansion=1M

-Xss 

  設定線程棧的大小,例如: -Xss128k

-XX:NewRatio 

  指定老年代的堆大小和新生代的堆大小比例,在使用CMS收集器時,

  此參數失效,例如: -XX:NewRatio=2

-XX:SurvivorRatio  

  指定New Generation中Eden Space與一個Survivor Space的heap size比例,

  -XX:SurvivorRatio=8, 那麼在總共New Generation為10m的情況下,Eden Space為8m 

-XX:MinHeapFreeRatio   

  指定jvm heap在使用率小于n的情況下,heap進行收縮,Xmx==Xms的情況下無

  效,如:-XX:MinHeapFreeRatio=30

-XX:MaxHeapFreeRatio   

  指定jvm heap在使用率大于n的情況下,heap進行擴張,Xmx==Xms的情況下無效,

  如:-XX:MaxHeapFreeRatio=70

-XX:LargePageSizeInBytes    

  指定Java heap的分頁頁面大小,如:-XX:LargePageSizeInBytes=128m

-XX:+UseCompressedClassPointers 

  壓縮類指針。對象的類指針(_klass)被壓縮至32bit,使用類指針壓縮空間的基位址

二、垃圾收集器調整參數

-XX:+UseCompressedOops 

  壓縮對象指針,oops是普通對象指針,Java堆中對象的對象指針被壓縮到

  32bit,使用堆基位址(如果在低于26G記憶體空間中,為0)即,指針的偏移量

  針對于堆的基位址。注意:64bit伺服器上設定-Xmx32g時,-XX:+UseCompressedOops

  和-XX:+UseCompressedClassPointers會失效,是以最大的堆設定為31g

-XX:+UseSerialGC  使用serial垃圾收集器

-XX:+UseParallelGC   

  指定在New Generation使用parallel collector,并行收集,同時啟動多個垃圾回收

  thread,不能和CMS gc一起使用。系統噸吐量優先,但是會有較長長時間的app pause,

  背景系統任務可以使用此gc 

-XX:+UseParallelOldGC   指定在Old Generation使用parallel collector

ParNew垃圾收集器相關的參數

-XX:ParallelGCThreads   

  限制ParNew垃圾收集的線程數,如:-XX:ParallelGCThreads=8

-XX:+UseParNewGC 

  強制指定在新生代使用ParNew收集器,是UseParallelGC的gc

  的更新版本,有更好的性能或者優點,可以和CMS gc一起使用

Parallel Scavenge垃圾收集器相關的參數

-XX:MaxGCPauseMillis 

  設定Parallel Scavenge垃圾收集器的最大垃圾收集停頓時間

-XX:GCTimeRatio 

  直接設定Parallel Scavenge垃圾收集器吞吐量的大小

-XX:+UseAdaptiveSizePolicy 

  這是一個開關參數,當這個參數打開後就不需要指定新生代的大小、

  Eden區和Survivor區的比例和晉升老年代對象的大小等細節參數了。

  虛拟機會根據目前系統運作情況收集性能監控資訊,動态調整這些

  參數以提供最合适的停頓時間或者最大吞吐量,這種調節方式稱為

  自适應調節政策。

-XX:+CMSParallelRemarkEnabled   在使用UseParNewGC的情況下,盡量減少mark的時間

-XX:+UseConcMarkSweepGC   指定在Old Generation使用concurrent cmark sweep gc,gc thread和app thread并行,是以稱作concurrent.app pause時間較短,适合互動性強的系統,如web server 

-XX:+UseCMSCompactAtFullCollection   在使用concurrent gc的情況下,防止memory fragmention,對live object進行整理,使memory碎片減少

-XX:CMSInitiatingOccupancyFraction=n   訓示在old generation在使用了n%的比例後,啟動concurrent collector,預設值是68,如:-XX:CMSInitiatingOccupancyFraction=70 有個bug,在低版本的jvm上出現,http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089

-XX:+UseCMSInitiatingOccupancyOnly  訓示隻有在old generation在使用了初始化的比例後concurrent collector啟動收集

三、虛拟機運作參數調整

-XX:MaxTenuringThreshold  指定一個object在經曆了n次young gc後轉移到old generation區,在linux64的java6下預設值是15,此參數對于throughput collector無效,如:-XX:MaxTenuringThreshold=31,-XX:MaxTenuringThreshold=0就是去掉了救助空間; 

-XX:+DisableExplicitGC  禁止java程式中的full gc,如System.gc()的調用

-XX:+UseFastAccessorMethods   原始類型get,set方法的優化

-verbose:gc  記錄GC運作以及運作時間,一般用來檢視GC是否有瓶頸

-XX:+PrintGCDetails  列印垃圾收集的情況如: [GC 15610.466: [ParNew: 229689K->20221K(235968K), 0.0194460 secs] 1159829K->953935K(2070976K), 0.0196420 secs]。

             隻要設定-XX:+PrintGCDetails 就會自動帶上-verbose:gc和-XX:+PrintGC

-XX:+HeapDumpOnOutOfMemoryError  輸出Dump 記憶體堆轉存快照  可以用 Eclipse Memory Analyzer工具來分析

-XX:+HeapDumpBeforeFullGC   産生dump日志,再通過jvisualvm.exe 或者Eclipse Memory Analysis Tools 工具進行分析

-XX:HeapDumpPath   産生dump日志的存放路徑,例如: -XX:HeapDumpPath=/httx/logs/dump

-XX:+PrintGCTimeStamps  列印垃圾收集的時間情況,如: [Times: user=0.09 sys=0.00, real=0.02 secs]

-XX:+PrintGCDateStamps  列印GC時間戳(以日期形式,如:2013-05-04T21:53:59.234+0800)

-XX:+PrintGCApplicationStoppedTime   列印垃圾收集時,系統的停頓時間,如: Total time for which application threads were stopped: 0.0225920 seconds

-XX:+UseCompressedOops  壓縮指針  64位機器,JDK1.6支援

-Xloggc  日志輸出的位置,例如: -Xloggc:/path/gc.log

-XX:+UseGCLogFileRotation  啟用GC日志檔案的自動轉儲

-XX:NumberOfGClogFiles   GC日志檔案的循環數目,例如:-XX:NumberOfGClogFiles=1

-XX:GCLogFileSize   控制GC日志檔案的大小,例如:-XX:GCLogFileSize=1M

-XX:+PrintHeapAtGC  如果設定PrintHeapAtGC參數,則HotSpot在GC前後都會将GC堆的概要狀況輸出到log中。

-XX:+UseAdaptiveSizePolicy   自動選擇年輕代區大小和相應的Survivor區比例。設定此選項後, 并行收集器會自動選擇年輕代區大小和相應的Survivor區比例,以達到目标系統規定的最低相應時間或者收集頻率等,                          此值建議使用并行收集器時,一直打開。 -XX:+PrintCommandLineFlags  列印出JVM初始化完畢後所有跟初始化的預設之不同的參數及他們的值 -XX:+PrintFlagsFinal  顯示所有可設定的參數及”參數處理”後的預設值可是檢視不同版本預設值,以及是否設定成功。輸出的資訊中”=”表示使用的是初始預設值,而”:=”表示使用的不是初始預設值

四、其他

-server  設定JVM使用server模式,jdk64位預設啟動該模式

-client   設定JVM使用client模式,

-agentlib:libname[=options]  用于加載本地的lib,例如配置jetty的遠端debug的一段配置: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=15005

-agentlib:hprof  用于擷取JVM的運作情況,例如:-agentlib:hprof=heap,format=b,file=/test.hprof   可以參考:https://blog.csdn.net/changyuan101/article/details/51995363

-agentpath:pathnamep[=options]  按全路徑裝載本地庫,不再搜尋PATH中的路徑;其他功能和agentlib相同,例如

-Dproperty=value  設定系統屬性名/值對

-jar  制定以jar包的形式執行一個應用程式

-javaagent:jarpath[=options]  實作premain方法在main方法前執行可以利用該方式玩一個JVM層面的hook很有意思的東西,例如:-javaagent:/opt/soft/skywalking/agent/skywalking-agent.jar  可以參考:https://baijiahao.baidu.com/s?id=1585656128092617457&wfr=spider&for=pc

-verbose:jni  輸出native方法的調用情況玩JNI必備技能

 java -XX:+PrintFlagsInitial 

  檢視本機的初始化參數

Jetty中的 jetty.sh中jvm的一段配置:

JAVA_OPTIONS=" -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./logs/gc_%p.log -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -javaagent:/opt/soft/skywalking/agent/skywalking-agent.jar -Xdebug -Xrunjdwp:transport=dt_socket,address=15059,server=y,suspend=n -server -Xmx768m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=256m -Xss2m"

Tomcat中jvm參數配置的一個簡單的demo,linux環境下在tomcat bin 目錄下 catalina.sh檔案

JAVA_OPTS="-server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../aml-fetch-oom.hprof -Xms8g -Xmx8g -XX:NewSize=2g -XX:MaxNewSize=2g"

調優參數參考:

-server -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:c:/opt/gc.log -Xms100m -Xmx100m -Xmn60m -XX:MetaspaceSize=128M -XX:+UseParallelGC -XX:+UseParallelOldGC
-server -Xms85m -Xmx85m -Xmn30m -XX:-UseGCOverheadLimit -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:/opt/aml-fetch-oom.hprof      

參考:

  【1】部落格,http://niweiwei.iteye.com/blog/2123347

  【2】部落格,http://hot66hot.iteye.com/blog/2075819

  【3】部落格,https://blog.csdn.net/huaweitman/article/details/50552960

  【4】部落格,https://www.cnblogs.com/f1194361820/p/5059367.html

  【5】部落格,http://www.cnblogs.com/redcreen/archive/2011/05/05/2038331.html,jvm調優參考配置

  【6】并發程式設計網,http://ifeve.com/useful-jvm-flags-part-4-heap-tuning/

  【7】部落格,https://blog.csdn.net/liubenlong007/article/details/78143285

  【8】部落格,https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html

  【9】部落格,https://www.cnblogs.com/zhulin-jun/p/6516292.html

  【10】部落格,https://blog.csdn.net/beautygao/article/details/79083058

  【11】部落格,https://blog.csdn.net/liubenlong007/article/details/78143285

轉載于:https://www.cnblogs.com/happyflyingpig/p/8886952.html