- 一. 添加JVM参数选项
- 1. 在Idea中添加JVM参数
- 2. 运行jar包时添加JVM参数
- 3. 程序运行过程中添加JVM参数
- 二. 常用JVM参数选项
- 1. 打印设置的XX选项及值
- 2. 堆、栈方法区等内存大小设置
- 1. 栈
- 2. 堆内存
- 3. 方法区
- 1. 永久代
- 2. 元空间
- 4. 直接内存
- 3. OOM相关选项
- 4. 垃圾收集器相关选项
- 1. 查看默认垃圾收集器
- 2. Serial回收器
- 3. ParNew回收器
- 4. Parallel回收器
- 5. CMS回收器
- 6. G1回收器
- 5. GC日志相关选项
- 1. 常用参数
- 2. 其他参数
- 6. 其他参数选项
在Edit Configuration中设置VM options参数
java -Xms50m -Xmx50m -XX:PrintGCDetails -XX:+PrintGCTimeStamps -jar demo.jar
3. 程序运行过程中添加JVM参数jinfo -flag = 设置非Boolean类型参数
jinfo -flag [+|-] 设置Boolean类型参数
-XX:PrintCommandLineFlags
在程序运行前打印出用户手动设置或者JVM自动设置的XX选项
-XX:PrintFlagsInitial
打印出所有XX选项的默认值
-XX:PrintFlagsFinal
打印出XX选项在运行程序时生效的值
-XX:PrintVMOptions
打印JVM的参数
-Xss128k
表示设置每个线程的栈大小为128k,等价于-XX:ThreadStackSize=128k
-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
表示设置让大于此阈值的对象直接分配在老年代,单位为字节,只对Serial、ParNew收集器有效
-XX:MaxTenuringThreshold=15
默认值为15,新生代每次MinorGC后,还存活的对象年龄+1,当对象的年龄大于设置的这个值时就进入老年代
-XX:+PrintTenuringDistribution
表示让JVM在每次MinorGC后打印出当前使用的Survivor中对象的年龄分布
-XX:TargetSurvivorRatio
表示MinorGC结束后Survivor区域中占用空间的期望比例
在JDK8之前叫做永久代
-XX:PermSize=256m
表示设置永久代初始值为256M
-XX:MaxPermSize=256m
表示设置永久代最大值为256M
在JDK8之后叫做元空间
-XX:MetaspaceSize
表示设置元空间初始空间大小
-XX:MaxMetaspaceSize
表示设置元空间最大空间,默认没有限制
-XX:+UseCompressedOops
表示设置压缩对象指针
-XX:+UseCompressedClassPointers
表示设置压缩类指针
-XX:CompressedClassSpaceSize
表示设置设置Class Metaspace的大小,默认1G
-XX:MaxDirectMemorySize
表示设定DirectMemory容量,若未指定,则默认与Java堆最大值一样
-XX:+HeapDumpOnOutOfMemoryError
表示在内存出现OOM的时候,把Heap转存Dump到文件以便后续分析
-XX:+HeapDumpBeforeFullGC
表示在出现FullGC之前,生成Heap转储文件
-XX:HeapDumpPath=
指定Heap转存文件的存储路径
-XX:OnOutOfMemoryError
指定一个可行性程序或者脚本的路径,当发生OOM的时候,去执行这个脚本
-XX:+PrintCommandLineFlags
查看命令行相关参数,包含使用的垃圾收集器
jinfo -flag 相关垃圾回收器参数 进程ID
使用命令行指令查看
2. Serial回收器Serial收集器作为HotSpot中Client模式下的默认新生代垃圾收集器。Serial Old是运行在Client模式下默认的老年代的垃圾回收器。
-XX:+UseSerialGc
指定年轻代和老年代都使用串行收集器。等价于新生代用Serial GC,且老年代用 Serial old GC。可以获得最高的单线程收集效率。
-XX:+UseParNewGC
手动指定使用ParNew收集器执行内存回收任务,它表示年轻代使用并行收集器,不影响老年代
-XX:ParallelGCThreads=N
限制线程数量,默认开启和CPU数据相同的线程数
-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收集器具有自适应调节策略
-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)/4,ParallelGCThreads是年轻代并 行收集器的线程数。当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的幂,范围是1MB到32MB之间,目标是根据最小的Java堆大小划分出约2048个区域,默认是堆内存的1/2000。
-Xx:MaxGCPauseMillis
设置期望达到的最大GC停顿时间指标,JVM会尽力实现,但不保证达到,默认值是200ms
-XX:ParallelGCThread
设置STW时GC线程数的值,最多设置为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区)溢出
-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:
表示把GC日志写入到一个文件中去,而不是打印到标准输出中
-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日心义件时人小
-XX:+DisableExplicitGC
表示禁止hotspot执行Systemgc(),默认禁用
-XX:ReservedCodeCacheSize=[gmk]、-XX:InitialCodeCacheSize=[g|m|k]
表示指定代码缓存的大小
-XX:+UseCodeCacheFlushing
表示使用该参数让JVM放弃一些被编译的代码,避免代码缓存被占满时JVM切换到interpreted-only的情况
-XX:+DoEscapeAnalysis
表示开启逃逸分析
-XX:+UseBiasedLocking
表示开启偏向锁
-XX:+UseLargePages
表示开启使用大页面
-XX:+UseTLAB
表示使用TLAB,默认打开
-XX:+PrintTLAB
表示打印TLAB的使用情况
-XX:TLABSize
表示设置TLAB大小
