深入理解Java虚拟机(三)——JVM运行参数设置
深入理解Java虚拟机(三)——JVM运行参数设置
文章目录
一. 添加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
表示设置让大于此阈值的对象直接分配在老年代,单位为字节,只对Serial
、ParNew
收集器有效
-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
收集器作为HotSpot
中Client
模式下的默认新生代垃圾收集器。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)/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
区)溢出
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
大小
更多推荐
所有评论(0)