常见的JVM参数

本文深入探讨了JVM的各种调优参数,包括堆内存、垃圾收集器、元空间、直接内存和线程栈的配置,以及CMS和G1垃圾收集器的详细设置。还涵盖了分析诊断工具和运行模式的选择,如-Xmx、-XX:MaxTenuringThreshold等。通过理解这些参数,可以有效优化Java应用程序的性能和稳定性。

(后边学习到新的会进行补充)

-XX:MaxTenuringThreshold:对象晋升老年代的阈值,默认值15(并不是绝对的,如果在Survivor空间中相同年龄所有对象大小的综合大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代)
-XX:MaxPermSize~~:永久代大小
-XX:MaxDirectMemorySize:直接内存大小,默认与-Xmx一致
-XX:+/-UseTLAB:是否开启TLAB
-XX:MaxMetaspace=256m:元数据区,默认为无限大,受Java进程所使用的内存影响
-XX:FieldsAllocationStyle:对象内存分布中的实例数据区域的存储顺序
-XX:CompactFields=true:由于HotSpot在分配对象实例数据时相同大小的字段总是被分配到一起存储,在满足这个条件下因此父类中定义的变量会出现在子类之前,开启此参数那子类中较小的变量也允许插入父类变量的空隙中,以节省一点空间
-XX:+UseCondCardMark:是否开启JVM卡表条件判断,尽量减少伪共享带来的性能损耗
-XX:MaxGCPauseMillis(毫秒 >0):控制最大垃圾收集停顿时间,默认值200
-XX:ParallelGCThreads=NUM:垃圾收集并行执行线程数,默认为CPU的核数
-XX:+UseAdaptiveSizePolicy:是否开启自适应调节策略,JDK8默认开启
-XX:SurvivorRatio:Eden和Survivor区的比例
-XX:PretenureSizeThreshold:晋升老年代对象大小,超过指定大小直接在老年代分配,默认为0
-XX:+PrintGCDetails:打印GC详细日志
-XX:+PrintHeapAtGC:打印每次GC前后堆、方法区可用容量变化
-XX:+PrintGCApplicationConcurrentTime :查看GC过程中用户线程并发时间
-XX:+PrintGCApplicationStoppedTime:查看GC过程中用户线程停顿时间
-XX:+PrintFlagsFinal:查看JVM参数的默认值

垃圾收集器相关:

CMS相关见文章
-XX:+UseConMarkSweepGC:开启使用CMS垃圾收集器,新生代使用ParNew 老年代使用CMS
-XX:CMSInitiatingOccupancyFraction=70:CMS垃圾收集器的回收阈值(老年代),JDK5及之前默认为68%,JDK6之后调整为92%。
-XX:+UseCMSInitiatingOccupancyOnly:与XX:CMSInitiatingOccupancyFraction配合使用,只是用设定的回收阈值(上面指定的70%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整。
-XX:+/-CMSPrecleaningEnabled:开启/关闭CMS并发预清理。


-XX:CMSScheduleRemarkEdenSizeThreshold:CMS可取消并发预处理阶段开启条件–>默认为2M
-XX:CMSMaxAbortablePrecleanLoops:CMS可取消并发预处理阶段取消条件–>循环次数,默认为0
-XX:CMSMaxAbortablePrecleanTime:CMS可取消并发预处理阶段取消条件–>最长执行时间,默认为5000毫秒
-XX:CMSScheduleRemarkEdenPenetration:CMS可取消并发预处理阶段取消条件–>Eden区的内存使用率大于此配置后取消,默认值为50
-XX:+UseCMSCompactAtFullCollection:在进行Full GC之前进行一次内存整理,默认开启
-XX:CMSFullGCBeforeCompaction=N:当执行过N此无碎片整理Full GC后,下次Full GC之前进行一次内存整理,默认为0,表示每次都进内存整理
-XX:+CMSScavengeBeforeRemark:强制在CMS最终/重标记阶段前进行一次Minor GC,防止可中断预清理一直没有等到年轻代Minor GC而导致年轻代对象太多而导致最终标记时间过长,导致停顿时间过长
-XX:+CMSPermGenSweepingEnabled:开启CMS对永久代(元空间)的垃圾收集,默认不开启
-XX:+CMSClassUnloadingEnabled:与-XX:+CMSPermGenSweepingEnabled配合使用,收集永久代时卸载不用的类
G1l垃圾收集器
-XX:G1HeapRegionSize=8:设置G1垃圾收集器Region大小,取值范围应为1MB ~ 32MB,且应为2的N次幂。
-XX:G1NewSizePercent:新生代最小值,默认值5%
-XX:G1MaxNewSizePercent:新生代最大值,默认值60%
-XX:ParallelGCThreads:STW期间,并行GC线程数
-XX:ConcGCThreads=n:并发标记期间,GC线程数
-XX:InitiatingHeapOccupancyPercent:设置触发标记周期的 Java 堆占用率阈值。默认值是45%。这里的java堆占比指的是nonyoungcapacitybytes,包括old+humongous
-XX:G1HeapWastePercent:G1停止回收的最小内存,默认是堆的5%,就是说不必要每次回收就把所有的垃圾的处理完,可遗留少量的下次处理,这样也降低了单次GC消耗的时间
-XX:+GCTimeRatio:计算花在Java应用线程上和花在GC线程上时间比率,默认是9,跟新生代内存的分配比例一样。**参数的主要目的是让用户可以控制花在应用上的时间,G1的计算公式是100/(1+GCTimeRatio)。**如果参数设置为9,则最多花10%的时间在GC上面,Parallel GC默认值是99,表示1%的时间被用在GC上面,这是因为Parallel GC贯穿整个GC,而G1则根据Region来进行划分,不需要全局性扫描整个内存
-XX:G1ReserverPercent:G1为分配担保预留的空间比例,默认10%,也就是老年代会预留10%的空间来给新生代对象晋升,如果经常由于新生代对象晋升失败导致FullGC,可以适当调大此参数(调大此参数同时意味着老年代可使用的空间减少)

堆内存参数

在这里插入图片描述

-Xmx:指定最大堆内存,如-Xmx49。但这只是限制了堆内存Heap部分的最大值,不包括堆外内存和栈内存
-Xms:指定堆内存的初始化大小,最小值,如Xms4g。而且指定的内存大小,并不是操作系统实际分配的初始值,而是GC先规划好,应用到才分配。专用服务需上需要保持-Xmx-Xms保持一致,否则应用刚启动可能就会有好几个FullGC。当两者配置不同时,堆内存扩容可能导致性能抖动。
-Xmn:等价于-XX:NewSize,Young区的大小,使用G1垃圾收集器不应该设置该选项,在其他的某些业务场景可以设置,官方建议设置为-Xmx的1/2~1/4
-XX:MaxPerSize:这是jdk1.7前使用的,JDK8后Meta空间默认无限大,此参数无效
-XX:MetaspeaceSize:Java8默认不限制Meta空间,一般不允许设置该选项
-XX:MaxDirectMemorySize:系统可食用的最大堆外内存,这个参数跟-Dsun.nio.MaxDirectMemorySize=1m等价
-Xss:设置每个线程栈的字节数,影响栈的深度

分析诊断相关

-XX:+-HeapDumpOnOutOfMemoryError:当OOMError产生时,自动Dump堆内存
-XX:HeapDumpPath:与HeapDumpOnOutOfMemoryError搭配使用,指定内存溢出时Dump文件的目录,默认为启动Java程序的工作目录下
-XX:OnError:发生致命错误时执行的脚本
-XX:OnOutOfMemoryError:抛出OOMError错误是执行的脚本
-XX:ErrorFile=fileName:致命错误的日志文件名,绝对路径或者相对路径
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1506:开启远程调试


运行模式

  • -server:设置JVM使用server模式,特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境。在具有64位JDK环境下将默认启用此模式,而忽略-client参数
  • -clinet:JDK1.7之前在32位的X86机器上的默认值是-client选项。设置JVM使用client模式,特点是启动速度较快,但运行时性能和内存管理效率不高,通常用于客户端程序或者本地PC机开发和调试。
  • -Xint:在解释模式下运行,-Xint标记会强制JVM解释所有的字节码,这会降低运行速度,通常低10倍或者更多
  • -Xcomp:-Xcomp参数与-Xint正好相反,JVM会在第一次使用时把所有的字节码编译成本地代码,从而带来最大程度的优化。[注意预热]
  • -Xmixed:-Xmixed是混合模式,将解释模式和编译模式进行混合使用,有JVM自己决定,这是JVM的默认模式,也是推荐模式,使用java -version可以看到 mixed mode等信息;

在这里插入图片描述

编译优化

-XX:+DoEscapeAnalysis:开启逃逸分析
-XX:+EliminateAllocations:开启标量替换
-XX:+EliminateLocks :开启同步消除
相关文章见:编译优化技术

参考资料

  • 官方最全JVM参数清单:https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html
### ### 堆内存配置参数 JVM 的堆内存是 Java 应用程序运行时的主要内存区域,用于存放对象实例。常见的配置参数包括: - **-Xms**:设置 JVM 启动时的初始堆内存大小。默认值为物理内存的 1/64,但不超过 1GB。建议在 Server 端将该值与 -Xmx 设置为相同大小,以避免频繁的内存调整 [^3]。 - **-Xmx**:设置 JVM 堆内存的最大值。该参数用于限制 JVM 可使用的最大内存,防止内存溢出。 示例: ```bash java -Xms4g -Xmx4g MyApp ``` - **-XX:MinHeapFreeRatio** 和 **-XX:MaxHeapFreeRatio**:控制堆内存的自动调整策略。当空闲内存比例超过 MaxHeapFreeRatio 时,JVM 会减小堆大小到 -Xms 指定的值 [^3]。 ### ### 垃圾收集器配置 不同的垃圾收集器适用于不同的应用场景,常见的配置参数如下: - **-XX:+UseSerialGC**:启用串行垃圾收集器,适用于单线程环境。 - **-XX:+UseParallelGC**:启用并行垃圾收集器(吞吐量优先),适用于多核服务器应用。 - **-XX:+UseConcMarkSweepGC**:启用 CMS(并发标记清除)垃圾收集器,适用于低延迟场景。 - **-XX:+UseG1GC**:启用 G1 垃圾收集器,适用于大堆内存和低延迟要求的应用。 示例: ```bash java -XX:+UseG1GC MyApp ``` ### ### GC策略配置 GC 策略决定了垃圾回收的行为和频率,常见参数包括: - **-XX:MaxGCPauseMillis**:设置 G1 收集器的目标最大停顿时间(毫秒),JVM 会尽量满足该限制。 - **-XX:G1HeapRegionSize**:设置 G1 分区大小,默认根据堆大小自动选择。 - **-XX:ParallelGCThreads**:设置并行 GC 的线程数。 - **-XX:ConcGCThreads**:设置并发 GC 的线程数。 ### ### GC日志配置 GC 日志对于性能调优和问题排查至关重要,常用参数包括: - **-Xlog:gc***:输出 GC 日志信息。 - **-Xlog:gc*:file=filename:time**:将 GC 日志输出到文件,并记录时间戳。 - **-XX:+PrintGCDetails**:输出详细的 GC 日志。 - **-XX:+PrintGCDateStamps**:在日志中显示时间戳。 - **-XX:+UseGCLogFileRotation** 和 **-XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M**:启用日志轮转,限制日志文件数量和大小。 示例: ```bash java -Xlog:gc*:file=gc.log:time MyApp ``` ### ### CMS常用参数 CMS(Concurrent Mark Sweep)是一种低延迟的垃圾收集器,常见配置参数包括: - **-XX:CMSInitiatingOccupancyFraction**:设置老年代使用率达到多少时触发 CMS GC,默认为 68%。 - **-XX:+UseCMSInitiatingOccupancyOnly**:确保 CMSInitiatingOccupancyFraction 的设置生效。 - **-XX:+CMSScavengeBeforeRemark**:在 CMS remark 阶段前执行一次 Young GC,减少 remark 阶段的暂停时间。 ### ### G1常用参数 G1(Garbage First)是一种适用于大堆内存的垃圾收集器,常见参数包括: - **-XX:MaxGCPauseMillis=200**:设置最大 GC 停顿时间目标。 - **-XX:G1ReservePercent=10**:设置预留内存百分比,防止并发模式失败。 - **-XX:InitiatingHeapOccupancyPercent=45**:设置触发并发标记周期的堆占用阈值。 ### ### Dump日志参数配置 当 JVM 发生内存溢出时,可以通过参数生成 dump 文件用于后续分析: - **-XX:+HeapDumpOnOutOfMemoryError**:在 OOM 时生成堆 dump 文件。 - **-XX:HeapDumpPath=./heapdump.hprof**:指定 dump 文件的保存路径。 示例: ```bash java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump.hprof MyApp ``` ### ### 常用启动参数 除了内存和 GC 相关参数,还有一些常用的 JVM 启动参数- **-Dproperty=value**:设置系统属性。 - **-verbose:class**:输出类加载信息。 - **-verbose:gc**:输出 GC 信息。 - **-jar**:运行可执行 JAR 文件。 - **-classpath/-cp**:指定类路径。 示例: ```bash java -Dmy.config=test -verbose:gc -cp myapp.jar com.example.Main ``` ### ### 各种场景的参数设置方式 - **开发环境**:保持默认堆大小,启用详细 GC 日志,便于调试。 - **测试环境**:根据负载模拟调整堆大小和 GC 策略。 - **生产环境**:设置 -Xms 和 -Xmx 相同,禁用 GC 自动调整,启用 G1 或 CMS,生成 OOM dump 文件。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

壹氿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值