一. 添加JVM参数选项

1. 在Idea中添加JVM参数

Edit Configuration中设置VM options参数

在这里插入图片描述

2. 运行jar包时添加JVM参数

java -Xms50m -Xmx50m -XX:PrintGCDetails -XX:+PrintGCTimeStamps -jar demo.jar

3. 程序运行过程中添加JVM参数

jinfo -flag <name>=<value> 设置非Boolean类型参数

jinfo -flag [+|-] <name> <pid> 设置Boolean类型参数

二. 常用JVM参数选项

1. 打印设置的XX选项及值

  • -XX:PrintCommandLineFlags

在程序运行前打印出用户手动设置或者JVM自动设置的XX选项

  • -XX:PrintFlagsInitial

打印出所有XX选项的默认值

  • -XX:PrintFlagsFinal

打印出XX选项在运行程序时生效的值

  • -XX:PrintVMOptions

打印JVM的参数

2. 堆、栈方法区等内存大小设置

1. 栈

  • -Xss128k

表示设置每个线程的栈大小为128k,等价于-XX:ThreadStackSize=128k

2. 堆内存

  • -Xms150m

表示设置JVM初始堆内存为150M ,等价于-XX:InitialHeapSize

  • -Xmx150m

表示设置JVM最大堆内存为150M,等价于-XXMaxHeapSize

  • -Xmn2g

表示设置年轻代大小为2G,官方推荐配置为整个堆大小的3/8

  • -XX:NewSize=1024m

表示设置年轻代初始值为1024M

  • -XX:MaxNewSize=1024m

表示设置年轻代最大值为1024M

  • -XX:SurvivorRatio=8

表示设置年轻代中Eden区与一个Survivor区的比值,默认为8

  • -XX:+UseAdaptiveSizePolicy

表示自动选择各区大小比例

  • -XX:NewRatio=4

表示设置老年代与年轻代的比值 (年轻代包括1个Eden和2个Survivor区)

  • -XX:PretenureSizeThreadshold=1024

表示设置让大于此阈值的对象直接分配在老年代,单位为字节,只对SerialParNew收集器有效

  • -XX:MaxTenuringThreshold=15

默认值为15,新生代每次MinorGC后,还存活的对象年龄+1,当对象的年龄大于设置的这个值时就进入老年代

  • -XX:+PrintTenuringDistribution

表示让JVM在每次MinorGC后打印出当前使用的Survivor中对象的年龄分布

  • -XX:TargetSurvivorRatio

表示MinorGC结束后Survivor区域中占用空间的期望比例

3. 方法区

1. 永久代

JDK8之前叫做永久代

  • -XX:PermSize=256m

表示设置永久代初始值为256M

  • -XX:MaxPermSize=256m

表示设置永久代最大值为256M

2. 元空间

JDK8之后叫做元空间

  • -XX:MetaspaceSize

表示设置元空间初始空间大小

  • -XX:MaxMetaspaceSize

表示设置元空间最大空间,默认没有限制

  • -XX:+UseCompressedOops

表示设置压缩对象指针

  • -XX:+UseCompressedClassPointers

表示设置压缩类指针

  • -XX:CompressedClassSpaceSize

表示设置设置Class Metaspace的大小,默认1G

4. 直接内存

-XX:MaxDirectMemorySize

表示设定DirectMemory容量,若未指定,则默认与Java堆最大值一样

3. OOM相关选项

  • -XX:+HeapDumpOnOutOfMemoryError

表示在内存出现OOM的时候,把Heap转存Dump到文件以便后续分析

  • -XX:+HeapDumpBeforeFullGC

表示在出现FullGC之前,生成Heap转储文件

  • -XX:HeapDumpPath=<path>

指定Heap转存文件的存储路径

  • -XX:OnOutOfMemoryError

指定一个可行性程序或者脚本的路径,当发生OOM的时候,去执行这个脚本

4. 垃圾收集器相关选项

1. 查看默认垃圾收集器

  • -XX:+PrintCommandLineFlags

查看命令行相关参数,包含使用的垃圾收集器

  • jinfo -flag 相关垃圾回收器参数 进程ID

使用命令行指令查看

2. Serial回收器

Serial收集器作为HotSpotClient模式下的默认新生代垃圾收集器Serial Old是运行在Client模式下默认的老年代的垃圾回收器。

  • -XX:+UseSerialGc

指定年轻代和老年代都使用串行收集器。等价于新生代用Serial GC,且老年代用 Serial old GC。可以获得最高的单线程收集效率。

3. ParNew回收器

  • -XX:+UseParNewGC

手动指定使用ParNew收集器执行内存回收任务,它表示年轻代使用并行收集器,不影响老年代

  • -XX:ParallelGCThreads=N

限制线程数量,默认开启和CPU数据相同的线程数

4. Parallel回收器

  • -XX:+UseParallelGc

手动指定年轻代使用Parallel并行收集器执行内存回收任务

  • -XX:+UseParallelOldGC

手动指定老年代都是使用并行回收收集器,分别适用于新生代和老年代。默认Jdk8是开启的,上面两个参数,默认开启一个,另一个也会被开启,互相激活

  • -XX:ParallelGCThreads

设置年轻代并行收集器的线程数。一般地,最好与CPU数量相等,以避免过多的线程数影响垃圾收集性能

在默认情况下,当CPU数量小于8个,ParallelGCThreads 的值等于CPU数量

CPU数量大于8个,ParallelgcThreads的值等于3+[5*CPU_Count]/8]

  • -XX:MaxGCPauseMillis

设置垃圾收集器最大停顿时间,即STW的时间,单位是毫秒

为了尽可能地把停顿时间控制在MaxGCPauseMills以内,收集器在工作时会调整Java堆大小或者其他一些参数

对于用户来讲,停顿时间越短体验越好。但是在服务器端,我们注重高并发,来体的吞吐量。所以服务器端适合Parallel,进行控制,该参数使用需谨慎

  • -XX:GCTimeRatio

垃圾收集时间占总时间的比例(=1/(N+1)),用于衡量吞吐量的大小

取值范围(0,100)。默认值99,也就是垃圾回收时间不超过1%

与前一个-XX:MaxGCPauseMillis参数有一定矛盾性。暂停时间越长,Radio参数就容易超过设定的比例。

  • -XX:+UseAdaptiveSizePolicy

设置Parallel Scavenge收集器具有自适应调节策略

5. CMS回收器

  • -XX:+UseConcMarkSweepGC

手动指定使用CMS收集器执行内存回收任务,开启该参数后会自动将-XX:+UseParNewGC打开

ParNew(Young区用)+CMS(Old区用)+Serial Old的组合

  • -XX:CMSlnitiatingOccupanyFraction

设置堆内存使用率的阈值,一旦达到该阈值 便开始进行 回收

  • -XX:+UseCMSCompactAtFullcollection

用于指定在执行完Full GC后对内存空间行压缩整理以此避免内存碎片的产生,不过由于内存压缩整理过程无法并发执行,所带来的问是就是停顿时间变得更长了

  • -XX:CMSFullGCsBeforeCompaction

设置在执行多少次FullGC后对内存空间进行用缩整理

  • -XX:ParallelCMSThreads

设置CMS的线程数量,CMS默认启动的线程数是(ParallelGCThreads+3)/4ParallelGCThreads是年轻代并 行收集器的线程数。当CPU资源比较紧张时,受到CMS收集器线程的影响,应用程序的性能在垃圾回收阶段可能会非常糟糕

  • -XX:ConcGCThreads

设置并发垃圾收集的线程数,默认该值是基于ParallelGCThi eads计算出来的

  • -XX:+UseCMSInitiatingOccupancyOnly

是否动态可调,用这个参数可以使CMS直按 CMSInitiatingOccupancyFraction设定的值启动

  • -XX:+CMSScavengeBeforeRemark

强制hotspot虚拟机在cms remark阶段之前做次minor gc,用于提高remark阶段的速度

  • -XX:+CMSClassUnloadingEnable

如果有的话,启用回收Perm区(JDK8之前)

  • -XX:+CMSParallelInitialEnabled

用于开启CMS initial-mark阶段采用多线程的方式进行标记,用于提高标记速度,在Java8开始已经默认开启

  • -XX:+CMSParallelRemarkEnabled

用户开启CMS remark阶段采用多线程的方式进行重新标记,默认开启

  • -XX:+ExplicitGCInvokesConcurrent、-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses

这两个参数用户指定hospot虚拟在执行System.gc()时使用CMS周期

  • -XX:+CMSPrecleaningEnabled

指定CMS是否需要进行Pre cleaning这个阶段

特别说明:
JDK9新特性:CMS被标记为Deprecate了
JDK14新特性:删除CMS垃圾回收器

6. G1回收器

  • -XX:+UseG1GC

手动指定使用G1收集器执行内存回收任务

  • -XX:G1HeapRegionpize

设置每个Region的大小。值是2的幂,范围是1MB32MB之间,目标是根据最小的Java堆大小划分出约2048个区域,默认是堆内存的1/2000

  • -Xx:MaxGCPauseMillis

设置期望达到的最大GC停顿时间指标,JVM会尽力实现,但不保证达到,默认值是200ms

  • -XX:ParallelGCThread

设置STWGC线程数的值,最多设置为8

  • -XX:ConcGCThreads

设置并发标记的线程数。将n设置为并行垃圾回收线程数(ParallelgcThreads)的1/4左右。

  • -XX:InitiatingHeapOccupancyPercent

设置触发并发GC周期的Java堆占用率阈值,超过此值,就触发GC,默认值是45

  • -XX:G1NewSizePercent、-XX:G1MaxNewSizePercent

新生代占用整个堆内存的最小百分比(默认5%)、最大百分比(默认60%)

  • -XX:G1ReservePercent=10

保留内存区域,防止 to space(Survivor中的to区)溢出

5. GC日志相关选项

1. 常用参数

  • -verbose:gc

表示输出GC信息,默认输出到标准输出,可以独立使用

  • -XX:+PrintGC

等同于-verbose:gc,表示打开简化的GC日志,可以独立使用

  • -XX:+PrintGCDetails

表示在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况,可以独立使用

  • -XX:+PrintGCTimeStamps

表示输出GC发生时的时间戳,不可以独立使用,需要配合-XX:+PrintGCDetails使用

  • -XX:+PrintGCDateStamps

表示输出GC发生时的时间戳(以日期的形式,如2021-12-26T11:53:59.234+0800),不可以独立使用,需要配合-XX:+PrintGCDetails使用

  • -XX:+PrintHeapAtGC

表示每一次GC前和GC后,都打印堆信息,可以独立使用

  • -Xloggc:<file>

表示把GC日志写入到一个文件中去,而不是打印到标准输出中

2. 其他参数

  • -XX:+TraceClassLoading

表示监控类的加载

  • -XX:+PrintGCApplicationStoppedTime

表示打印GC时线程的停顿时间

  • -XX:+PrintGCApplicationConcurrentTime

表示垃圾收集之前打印出应用未中断的执行时间

  • -XX:+PrintReferenceGC

表示记录回收了多少种不同引用类型的引用

  • -XX:+PrintTenuringDistribution

表示让JVM在每次MinorGC后打印出当前使用的Survivor中对象的年龄分布

  • -XX:+UseGCLogFileRotation

表示启用GC日志文件的自动转储

  • -XX:NumberOfGClogFiles=1

表示GC日志文件的循环数目

  • -XX:GCloafllesize=1M

表示控制GC日心义件时人小

6. 其他参数选项

  • -XX:+DisableExplicitGC

表示禁止hotspot执行Systemgc(),默认禁用

  • -XX:ReservedCodeCacheSize=<n>[gmk]、-XX:InitialCodeCacheSize=<n>[g|m|k]

表示指定代码缓存的大小

  • -XX:+UseCodeCacheFlushing

表示使用该参数让JVM放弃一些被编译的代码,避免代码缓存被占满时JVM切换到interpreted-only的情况

  • -XX:+DoEscapeAnalysis

表示开启逃逸分析

  • -XX:+UseBiasedLocking

表示开启偏向锁

  • -XX:+UseLargePages

表示开启使用大页面

  • -XX:+UseTLAB

表示使用TLAB,默认打开

  • -XX:+PrintTLAB

表示打印TLAB的使用情况

  • -XX:TLABSize

表示设置TLAB大小

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐