一、記憶體調整參數
-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