今日は、JVM
Common について詳しく見ていきましょう。いくつかのパラメータを調整しています。
JVM
:
パラメータのタイプは、JVM# の先頭に従って区別できます。 ## パラメータ、クラスは全部で 3 種類あります: "
-"、"
-X"、"
-XX"、
-verbose:class、
-verbose:gc、
-verbose:jni... …
Xms20m、
-Xmx20m、
-Xmn20m、
-Xss128k...
例: -XX: PrintGCDetails
、-XX:-UseParallelGC
、-XX: PrintGCTimeStamps....
-Xms
初期ヒープサイズ、msはmemory startの略称で、-XX:InitialHeapSizeと同等です。
-Xmx
最大ヒープ サイズ、mx は Memory max の略称で、パラメータ -XX:MaxHeapSize
注: 通常の場合環境、サーバー プロジェクト 運用中、ヒープ領域は縮小と拡大を続け、必然的にシステムに不必要な負荷がかかります。
したがって、運用環境では、
GC## を避けるために、
JVMの
Xmsと
Xmxを同じサイズに設定する必要があります。 #ヒープサイズの調整によって生じる不必要な圧力。
-XX:NewSize=n
若い世代のサイズを設定します。 -XX:NewRatio=n
古い世代に対する若い世代の比率を設定します。
例: -XX:NewRatio=3
。これは、若い世代と古い世代の比率が 1:3
であり、若い世代が若い世代と古い世代の合計を占めます。1/4、新しい世代と古い世代のデフォルトの比率は 1:2
です。 -XX:SurvivorRatio=n
若い世代の 2 つの Survivor エリアに対する Eden エリアの比率。
Survivor エリアが 2 つあることに注意してください。デフォルトは 8 で、これは次のことを意味します: Eden:S0:S1=8:1:1
例: -XX: SurvivorRatio=3
、Eden: Survivor
=3:2 を意味し、1 つの Survivor エリアが若い世代全体の 1/5 を占めます。
-XX:MetaspaceSize:Metaspace
スペースの初期サイズ, if 設定されていない場合、デフォルトは 20.79M です。この初期サイズは、最初の Metaspace Full GC
をトリガーするしきい値です。
例: -XX:MetaspaceSize=256M
-XX:MaxMetaspaceSize:Metaspace
最大値であり、デフォルトはそうではありません。サイズを制限しますが、オンライン環境の推奨設定です。
例: -XX:MaxMetaspaceSize=256M
##-XX:MinMetaspaceFreeRatio: Metaspace が発生した後の最小アイドル率GC では、
Metaspace の空き率が計算されます。空き率 (空き容量/現在の
Metaspace サイズ) がこの値より小さい場合、
Metaspace の拡張は行われます。引き起こされる。デフォルト値は 40 (40%) です。例: -XX:MinMetaspaceFreeRatio=40
: Metaspace で GC が発生した場合の最大アイドル率, Metaspace
の空き率が計算され、空き率 (空き領域/現在のメタスペース サイズ) がこの値より大きい場合、Metaspace
がトリガーされて領域が解放されます。デフォルト値は 70 (70%) です。例: -XX:MaxMetaspaceFreeRatio=70
<blockquote data-tool="mdnice编辑器" style="border-top: none;border-right: none;border-bottom: none;font-size: 0.9em;overflow: auto;color: rgb(106, 115, 125);padding: 10px 10px 10px 20px;margin-bottom: 20px;margin-top: 20px;border-left-color: rgb(239, 112, 96);background: rgb(255, 249, 249);"><p style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;color: black;line-height: 26px;">頻繁な拡張を避けるために、<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">MetaspaceSize
と MaxMetaspaceSize
を同じサイズに設定することをお勧めします。
-Xss: スタック領域のサイズ、スタックはスレッド専用です。 、したがって、スレッドによって使用されるスタック領域のサイズです。
例: -Xss256K
、このパラメータが設定されていない場合、デフォルト値は 1M
です。一般的には、256K
に設定します。十分です。
シリアル ガベージ コレクタ (新世代)
Enable: -XX: UseSerialGC オフにする: -XX:-UseSerialGC //新世代は Serial を使用し、旧世代は SerialOld
ParNew ガベージ コレクター (新世代)
Enable -XX: UseParNewGC -XX:-UseParNewGC をオフにする //新世代は関数 ParNew を使用し、旧世代は関数 CMS
Parallel Scavenge コレクター (新世代) を使用します
-XX をオンにする: UseParallelOldGC -XX:-UseParallelOldGC をオフにする //新しい世代は Parallel Scavenge 関数を使用します。古い世代は Parallel Old コレクターを使用します
ParallelOl ガベージ コレクター (古い世代)
Enable -XX: UseParallelGC -XX:-UseParallelGC をオフにする //新しい世代は Parallel Scavenge 関数を使用します。古い世代は Parallel Old コレクターを使用します
CMS ガベージ コレクター (古い世代)
Enable -XX: UseConcMarkSoupGC -XX:-UseConcMarkSoupGC
G1 ガベージ コレクターをオフにする
-XX:UseG1GC をオンにする 閉じる -XX:-UseG1GC
-XX:MaxGCPauseMillisの割合を減らして GC をトリガーすると、マーキング サイクルの Java ヒープ占有がトリガーされます。 。 レート閾値。デフォルトの占有率は、Java ヒープ全体の 45% です。
-XX:InitiatingHeapOccupancyPercent=n新しい世代に収容できる最大のオブジェクトです。新しい世代に収容できる最大オブジェクトより大きい場合、古い世代に直接割り当てられます。0 は制限がないことを表します。
-XX:PretenureSizeThreshold=1000000 //
古い世代の最小 GC 経過時間を入力すると、若い世代のオブジェクトが古い世代のオブジェクトの最小経過時間の値に変換されます。デフォルト値は 7
-XX です。 :InitialTenuringThreshol=7
古い世代の年齢をアップグレードします。最大値は 15
-XX:MaxTenuringThreshold
Number of GC 並列実行スレッド
-XX: ParallelGCThreads=16
System.gc() を無効にします。このメソッドはデフォルトで FGC をトリガーし、パラメーターの UseG1GC と UseConcMarkSoupGC を無視するためです。 、必要に応じてこのメソッドを無効にすることができます。
#-XX:- DisableExplicitGCスループット サイズを設定します。デフォルトは 99
XX:GCTimeRatio適応戦略をオンにすると、各領域の比率、旧世代への昇格年齢、その他のパラメータが自動的に調整されます。スループットと一時停止時間のバランスをとるため。
XX:UseAdaptiveSizePolicyプログラム実行時間に占める GC 時間の割合を設定します
GCTimeRatio
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath
堆内存出现OOM
的概率是所有内存耗尽异常中最高的,出错时的堆内信息对解决问题非常有帮助。
所以给JVM
设置这个参数(-XX:+HeapDumpOnOutOfMemoryError
),让JVM
遇到OOM
异常时能输出堆内信息,并通过(-XX:+HeapDumpPath
)参数设置堆内存溢出快照输出的文件地址。
这对于特别是对相隔数月才出现的OOM
异常尤为重要。
-Xms10M -Xmx10M -Xmn2M -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\study\log_hprof\gc.hprof
-XX:OnOutOfMemoryError
表示发生OOM后
,运行jconsole.exe
程序。
这里可以不用加“”,因为jconsole.exe
路径Program Files含有空格。利用这个参数,我们可以在系统OOM
后,自定义一个脚本,可以用来发送邮件告警信息,可以用来重启系统等等。
-XX:OnOutOfMemoryError="C:\Program Files\Java\jdk1.8.0_151\bin\jconsole.exe"
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-Xmx3500m
设置JVM
最大可用内存为3550M。
-Xms3500m
设置JVM
初始
内存为3550m
。此值可以设置与-Xmx
相同,以避免每次垃圾回收完成后JVM重新分配内存。-Xmn2g
设置年轻代大小为2G
。
整个堆大小=年轻代大小 + 年老代大小 + 方法区大小
-Xss128k
设置每个线程的堆栈大小。
JDK1.5
以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
-XX:NewRatio=4
设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5 。
-XX:SurvivorRatio=4
设置年轻代中Eden区与Survivor区的大小比值。
设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6 -XX:MaxPermSize=16m
设置持久代大小为16m。
-XX:MaxTenuringThreshold=0
设置垃圾最大年龄。
如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代即被回收的概论。
比如,我们启动一个user-service项目:
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:+PrintHeapAtGC -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -Xloggc:/opt/user-service-gc-%t.log -jar user-service-1.0-SNAPSHOT.jar
参数解释:
-Xloggc:/opt/app/ard-user/user-service-gc-%t.log 设置日志目录和日志名称 -XX:+UseGCLogFileRotation 开启滚动生成日志 -XX:NumberOfGCLogFiles=5 滚动GC日志文件数,默认0,不滚动 -XX:GCLogFileSize=20M GC文件滚动大小,需开启UseGCLogFileRotation -XX:+PrintGCDetails 开启记录GC日志详细信息(包括GC类型、各个操作使用的时间),并且在程序运行结束打印出JVM的内存占用情况 -XX:+ PrintGCDateStamps 记录系统的GC时间 -XX:+PrintGCCause 产生GC的原因(默认开启)
对于很多没用过的人来说,面试官问项目中这些参数是怎么用?此时,很容易选择妥协,傻傻的回答没用过。
偷偷的告诉你,很多面试官也没有用过。
另外,你可以自己搞个小项目,把JVM
参数设置小点,使用测试工具JMeter
,多线程测试一下。
以上がMeituan インタビュー: JVM チューニング パラメータによく知られているものは何ですか? 幸いなことに、私は準備ができています。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。