ホームページ  >  記事  >  Java  >  Meituan インタビュー: JVM チューニング パラメータによく知られているものは何ですか? 幸いなことに、私は準備ができています。

Meituan インタビュー: JVM チューニング パラメータによく知られているものは何ですか? 幸いなことに、私は準備ができています。

Java后端技术全栈
Java后端技术全栈転載
2023-08-24 15:25:56926ブラウズ


Meituan インタビュー: JVM チューニング パラメータによく知られているものは何ですか? 幸いなことに、私は準備ができています。
img

今日は、JVMCommon について詳しく見ていきましょう。いくつかのパラメータを調整しています。

で始まるもの バージョンに変更がありましたが、今のところ、X で始まる非標準化パラメータはほとんど変更されていません。
格式:-XX:[+-]<name> 表示启用或者禁用name属性。
例子:-XX:+UseG1GC(表示启用G1垃圾收集器)
Meituan インタビュー: JVM チューニング パラメータによく知られているものは何ですか? 幸いなことに、私は準備ができています。
-XX: PrintCommandLineFlags

JVM:

によって現在設定されている関連パラメータを表示します。
Meituan インタビュー: JVM チューニング パラメータによく知られているものは何ですか? 幸いなことに、私は準備ができています。

JVM パラメータの分類

パラメータのタイプは、JVM# の先頭に従って区別できます。 ## パラメータ、クラスは全部で 3 種類あります: "-"、"-X"、"-XX"、

Standardパラメータ (-): すべての JVM 実装 これらのパラメータの関数は実装されており、下位互換性がある必要があります;

例:

-verbose:class-verbose:gc-verbose:jni... …

非標準パラメータ (-X): デフォルトの jvm はこれらのパラメータの機能を実装しますが、すべての jvm 実装が満たされることを保証するものではありません、下位互換性は保証されていません;

例:

Xms20m-Xmx20m-Xmn20m-Xss128k...

非安定パラメータ (-XX) : このようなパラメータの各 jvm 実装は異なり、将来いつでもキャンセルされる可能性があるため、注意して使用する必要があります。

例: -XX: PrintGCDetails-XX:-UseParallelGC-XX: PrintGCTimeStamps....

ヒープパラメータ設定

-Xms 初期ヒープサイズ、msはmemory startの略称で、-XX:InitialHeapSizeと同等です。 -Xmx 最大ヒープ サイズ、mx は Memory max の略称で、パラメータ -XX:MaxHeapSize

注: 通常の場合環境、サーバー プロジェクト 運用中、ヒープ領域は縮小と拡大を続け、必然的にシステムに不必要な負荷がかかります。

したがって、運用環境では、GC## を避けるために、JVMXmsXmx を同じサイズに設定する必要があります。 #ヒープサイズの調整によって生じる不必要な圧力。

-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=3Eden: Survivor=3:2 を意味し、1 つの Survivor エリアが若い世代全体の 1/5 を占めます。

Metaspace パラメーター

-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

##-XX:MaxMetaspaceFreeRatio

: 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);'>MetaspaceSizeMaxMetaspaceSize を同じサイズに設定することをお勧めします。

スタックパラメータ設定

-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

##GC 戦略パラメーターの構成

GC 一時停止時間。ガベージ コレクターはさまざまな手段を試行します。たとえば、若い世代

-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

Dump异常快照

-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"

8G内存的服务器该如何设置

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区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代即被回收的概论。

项目中,GC日志配置

比如,我们启动一个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 サイトの他の関連記事を参照してください。

声明:
この記事はJava后端技术全栈で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。