Heim >Java >JavaInterview Fragen >Meituan-Interview: Mit welchen JVM-Tuning-Parametern bin ich vertraut?

Meituan-Interview: Mit welchen JVM-Tuning-Parametern bin ich vertraut?

Java后端技术全栈
Java后端技术全栈nach vorne
2023-08-24 15:25:561116Durchsuche


Meituan-Interview: Mit welchen JVM-Tuning-Parametern bin ich vertraut?
img

Machen wir uns heute damit vertraut, ungefährJVMOptimieren Sie einige häufig verwendete Parameter. JVM调优常用的一些参数。

X或者XX开头的都是非标准化参数

Meituan-Interview: Mit welchen JVM-Tuning-Parametern bin ich vertraut?

意思就是说标准化参数不会变,非标准化参数可能在每个JDK版本中有所变化,但是就目前来看X开头的非标准化的参数改变的也是非常少。

格式:-XX:[+-]<name> 表示启用或者禁用name属性。
例子:-XX:+UseG1GC(表示启用G1垃圾收集器)

-XX:+PrintCommandLineFlags查看当前JVM

Dinge, die beginnen mit Es wird gesagt, dass sich die standardisierten Parameter nicht ändern und die nicht standardisierten Parameter in jedem JDK-Version, aber bisher haben sich die nicht standardisierten Parameter, die mit X beginnen, nur sehr wenig geändert. 🎜
-Xms10M -Xmx10M -Xmn2M -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=D:\study\log_hprof\gc.hprof
🎜-XX:+PrintCommandLineFlagsView Current<img src="https://img.php.cn/upload/article/001/273/727/d63fc363fa710c707d1e38539968540e-2.png" alt="Meituan-Interview: Mit welchen JVM-Tuning-Parametern bin ich vertraut?" ><h2 data-tool="mdnice编辑器" style="max-width:90%"> <span style="display: inline-block;background: rgb(239, 112, 96);color: rgb(255, 255, 255);padding: 3px 10px 1px;border-top-right-radius: 3px;border-top-left-radius: 3px;margin-right: 3px;"> JVM参数分类</span><span style="display: inline-block;vertical-align: bottom;border-bottom: 36px solid #efebe9;border-right: 20px solid transparent;"> </span> </h2> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">根据Farbe: rgba(27, 31, 35, 0.05);Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“ >JVM</p>参数开头可以区分参数类型, 共三类:“-”、“-XX code>“, <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);'>JVM参数开头可以区分参数类型,共三类:“-”、“-X”、“-XX”,

标准参数(-):所有的JVM实现都必须实现这些参数的功能,而且向后兼容;

例子:-verbose:class-verbose:gc-verbose:jni……

非标准参数(-X):默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;

例子:Xms20m-Xmx20m-Xmn20m-Xss128k……

标准参数(-):所有的JVM实现都必须实现这些参数的功能,而且向后兼容;

例子::-verbose:class-verbose:gc-verbose:jni……有jvm实现都满足,且不保证向后兼容;🎜🎜例子:-Xmn20m-Xss128k……🎜🎜非Stable参数(-XX):此类参数各个jvm实现会有所不同, 将来可能会随时取消, 需要慎重使用;🎜

例子:-XX:+PrintGCDetails-XX:-UseParallelGC-XX:+PrintGCTimeStamps……-XX:+PrintGCDetails-XX:-UseParallelGC-XX:+PrintGCTimeStamps……

堆参数设置

-Xms 初始堆大小,ms是memory start的简称 ,等价于-XX:InitialHeapSize-Xmx 最大堆大小,mx是memory max的简称 ,等价于参数-XX:MaxHeapSize

注意:在通常情况下,服务器项目在运行过程中,堆空间会不断的收缩与扩张,势必会造成不必要的系统压力。

所以在生产环境中,JVMXmsXmx要设置成大小一样的,能够避免GC

堆参数设置

-Xms 初始堆大小,ms是memory start的简称 等价于-XX:InitialHeapSize-Xmx 最大堆大小, mx是memory max的简称, 等价于参数-XX:MaxHeapSize🎜

注意:在通常情况下, 服务器项目在运行过程中, 堆空间会不断的收缩与扩张, 势必会造成不必要的系统压力.🎜

所以在生产环境中,JVMXmsXmx要设置成大小一样的,能够避免GC在调整堆大小带来的不必要的压力.🎜

-XX:NewSize=n Einstellungen Größe der jungen Generation-XX:NewRatio=n Legen Sie das Verhältnis zwischen junger und alter Generation fest. -XX:NewSize=n 设置年轻代大小-XX:NewRatio=n 设置年轻代和年老代的比值。

如:-XX:NewRatio=3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4,默认新生代和老年代的比例=1:2-XX:SurvivorRatio=n 年轻代中Eden区与两个Survivor区的比值。

注意Survivor区有两个,默认是8,表示:Eden:S0:S1=8:1:1

如:-XX:SurvivorRatio=3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5。

元空间参数

-XX:MetaspaceSizeMetaspace 空间初始大小,如果不设置的话,默认是20.79M,这个初始大小是触发首次 Metaspace Full GC

Zum Beispiel:-XX:NewRatio=3 Code >, was angibt, dass das Verhältnis zwischen der jungen Generation und der alten Generation <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; Hintergrundfarbe: RGBA (27, 31, 35, 0,05);Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, Monospace;Wortumbruch: Break-All;Farbe: RGB(239, 112, 96) ;">1: 3, die junge Generation macht 1/4 der gesamten jungen und alten Generation aus, Standardverhältnis der neuen Generation zur alten Generation=1:2. -XX:SurvivorRatio=n Junge Generation Die Verhältnis des Eden-Gebiets zu den beiden Survivor-Gebieten. 🎜🎜Beachten Sie, dass es zwei Survivor-Bereiche gibt. Der Standardwert ist 8, was bedeutet: Eden:S0:S1=8:1:1🎜🎜Zum Beispiel: -XX:SurvivorRatio=3, was bedeutet: Eden: Survivor=3:2, ein Survivor-Bereich macht 1/5 der gesamten jungen Generation aus. 🎜

Metaspace-Parameter

🎜-XX:MetaspaceSizeMetaspace Die anfängliche Größe des Leerzeichens. Wenn nicht festgelegt, ist der Standardwert 20,79 MB. Diese anfängliche Größe ist die Beim ersten Mal wird es ausgelöst. 35, 0,05);font -family: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">Metaspace Full GC 's Schwelle. 🎜

例如:-XX:MetaspaceSize=256M -XX:MetaspaceSize=256M

-XX:MaxMetaspaceSizeMetaspace 最大值,默认不限制大小,但是线上环境建议设置。

例如:-XX:MaxMetaspaceSize=256M

-XX:MinMetaspaceFreeRatio:最小空闲比,当 Metaspace 发生 GC 后,会计算 Metaspace 的空闲比,如果空闲比(空闲空间/当前 Metaspace 大小)小于此值,就会触发 Metaspace 扩容。默认值是 40 ,也就是 40%,例如 -XX:MinMetaspaceFreeRatio=40

-XX:MaxMetaspaceFreeRatio:最大空闲比,当 Metaspace发生 GC 后,会计算 Metaspace 的空闲比,如果空闲比(空闲空间/当前 Metaspace 大小)大于此值,就会触发 Metaspace 释放空间。默认值是 70 ,也就是 70%,例如 -XX:MaxMetaspaceFreeRatio=70

-XX:MaxMetaspaceSize-XX:MaxMetaspaceSize=256M🎜🎜-XX:MinMetaspaceFreeRatio:最小空闲比,当 Metaspace 发生 GC 后,会计算 Metaspace 的空闲比,如果空闲比(空闲空间/当前 Metaspace 大小)小于此值,就会触发 Metaspace 扩容。默认值是 40,也就是 40%,例如 - XX:MinMetaspaceFreeRatio=40🎜🎜-XX:MaxMetaspaceFreeRatio:最大空闲比,当 Metaspace发生 GC 后,会计算 Metaspace 释放空间。默认值是 70,也就是 70%,例如 -XX:MaxMetaspaceFreeRatio=70🎜

Es wird empfohlen, dass MetaspaceSizeMaxMetaspaceSize设置为同样大小,避免频繁扩容。

栈参数设置

-Xss:栈空间大小,栈是线程独占的,所以是一个线程使用栈空间的大小。

例如:-Xss256K,如果不设置此参数,默认值是1M,一般来讲设置成 256K ausreicht.

Collector-Parametereinstellungen

Serieller Garbage Collector (neue Generation)

Aktivieren: -XX:+UseSerialGC Deaktivieren Sie: -XX:-UseSerialGC //Die neue Generation verwendet Serial und die alte Generation verwendet SerialOld

ParNew Garbage Collector (neue Generation)

Enable -XX:+UseParNewGC Deaktivieren Sie -XX:-UseParNewGC //Die neue Generation verwendet die Funktion ParNew und die alte Generation verwendet die Funktion CMS

Parallel Scavenge Collector (neue Generation)

Enable -XX:+UseParallelOldGC Deaktivieren Sie -XX:-UseParallelOldGC //Die neue Generation verwendet die Funktion Parallel Scavenge. Die alte Generation verwendet den Parallel Old Collector

ParallelOl Garbage Collector (alte Generation)

enable -XX:+UseParallelGC Deaktivieren Sie -XX:-UseParallelGC //Die neue Generation verwendet die Funktion Parallel Scavenge. Die alte Generation verwendet den Parallel Old Collector

CMS Garbage Collector (alte Generation)

enable -XX:+UseConcMarkSweepGC Schalten Sie -XX:-UseConcMarkSweepGC

G1 Garbage Collector

Turn on -XX:+UseG1GC aus Deaktivieren Sie -XX:-UseG1GC

GC-Strategieparameterkonfiguration

GC-Pausenzeit. Der Garbage Collector wird versuchen, diese Zeit mit verschiedenen Mitteln zu erreichen, z. B. durch Reduzierung der jungen Generation

-XX: MaxGCPauseMillis

Der Anteil des belegten Heaps, der GC auslöst, ist der Java-Heap-Belegungsschwellenwert, der den Markierungszyklus auslöst. Die Standardbelegungsrate beträgt 45 % des gesamten Java-Heaps

-XX:InitiatingHeapOccupancyPercent=n

Das größte Objekt, das die neue Generation aufnehmen kann, wird direkt der alten Generation zugewiesen . 0 bedeutet keine Begrenzung.

-XX:PretenureSizeThreshold=1000000 //

Geben Sie das Mindest-GC-Alter der alten Generation ein und konvertieren Sie die Objekte der jungen Generation in den Mindestalterwert der Objekte der alten Generation. Der Standardwert ist 7

-XX: InitialTenuringThreshol=7

Upgrade der alten Generation Alter, der Maximalwert beträgt 15

-XX :MaxTenuringThreshold

Anzahl der parallelen GC-Ausführungsthreads

-XX:ParallelGCThreads=16

Deaktivieren Sie System.gc(), da diese Methode standardmäßig FGC auslöst und ignoriert UseG1GC und UseConcMarkSweepGC in den Parametern, sodass Sie diese Methode bei Bedarf deaktivieren können.

-XX:-+DisableExplicitGC

Stellen Sie die Durchsatzgröße ein, der Standardwert ist 99

XX:GCTimeRatio

Aktivieren Sie die adaptive Strategie, das Verhältnis jedes Bereichs und das Alter der Beförderung zur alten Generation und andere Parameter werden automatisch angepasst. Um ein Gleichgewicht zwischen Durchsatz und Pausenzeit zu erreichen.

XX:UseAdaptiveSizePolicy

Legen Sie den Prozentsatz der GC-Zeit fest, der von der Programmlaufzeit belegt wird

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,多线程测试一下。

Das obige ist der detaillierte Inhalt vonMeituan-Interview: Mit welchen JVM-Tuning-Parametern bin ich vertraut?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:Java后端技术全栈. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen

In Verbindung stehende Artikel

Mehr sehen