JVM: 调优参数设置

逃离我推掉我的手 2023-10-02 13:56 143阅读 0赞

一、通用参数













































































































































选项 描述 使用示例
-Xms 设置Java堆的初始大小。当可用的Java堆区内存小于40%时,JVM就会将内存调整到选项-Xmx所允许的最大值。如果不设置默认堆大小为物理内存的1/4;可以使用jmap -heap <pid>查看堆使用情况 -Xms10M
-Xmx 设置Java堆的最大值。当可用的Java堆区内存大于70%时,JVM就会将内存调整到选项-Xms所指定的初始值。与-Xms设置为一样的话可以避免堆自动扩展带来的性能开销。 -Xmx30M
-Xss 设置栈容量大小。每个线程都拥有一个栈,生命周期与线程相同,每个方法的调用都会创建一个栈帧。在堆容量确定的情况下,栈容量越大意味着能建立的线程越少。在相同物理内存下,减小这个值能生成更多的线程。JDK8默认1024k,可通过命令查看默认大小:
java -XX:+PrintFlagsFinal -version
grep ThreadStackSize
-Xmn 设置新生代的大小。-Xmn的内存大小为Eden+2个Surivivor空间的值,官方建议配置为整个堆的3/8。 -Xmn10M
-XX:NewSize 设置新生代的初始大小。和-Xmn等价,推荐使用-Xmn,相当于一次性设定了NewSize与MaxNewSize的内存大小。 -XX:NewSize=10M
-XX:MaxNewSize 设置新生代的最大值 -XX:MaxNewSize=10M
-XX:NewRatio 新生代(Eden+2个Surivivor空间)与老年代(不包括永久代)的比值 -XX:NewRatio=4,表示新生代与老年代所占的比值为1:4
-XX:SurivivorRatio Eden与一个Surivivor的比值大小。默认为8:1,即Eden占8/10。 -XX:SurvivorRatio=8
-XX:PermSize 设置非堆内存(方法区,永久代)的初始大小。方法区主要存放Class相关信息,如类名、访问修饰符、常量池、字段描述等。 -XX:PermSize=10M
-XX:MaxPermSize 设置非堆内存(方法区,永久代)的最大值 -XX:MaxPermSize=50M
-XX:MaxDirectMemorySize 设置本机直接内存大小。一般通过Unsalf类来操作直接内存。 -XX:MaxDirectMemorySize=100M
-XX:PretenureSizeThreshold 设置对象超过指定字节大小时直接分配到老年代 -XX:PretenureSizeThreshold=3145728
-XX:+HandlePromotionFailure 是否允许新生代收集担保失败。进行一次minor gc后, 另一块Survivor空间不足时,将直接会在老年代中保留 -XX:+HandlePromotionFailure
-XX:ParallelGCThreads 设置并行GC进行内存回收的线程数 -XX:ParallelGCThreads=4
-XX:MaxTenuringThreshold 晋升到老年代的对象年龄。每次Minor GC之后,存活年龄就加1,当超过这个值时进入老年代。默认为15 -XX:MaxTenuringThreshold=15
-XX:+HeapDumpOnOutOfMemoryError 内存溢出时Dump出当前的内存堆转储快照以便事后进行分析 -XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails 发生垃圾收集时打印详细回收日志,并且在退出的时候输出当前内存区域分配情况。 -XX:+PrintGCDetails
-XX:+PrintGCDateStamps 输出GC时的时间戳 XX:+PrintGCDateStamps
XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息 XX:+PrintHeapAtGC
-XX:+PrintGCApplicationStoppedTime 输出GC造成应用暂停的时间 -XX:+PrintGCApplicationStoppedTime
-Xloggc 日志文件的输出路径 -Xloggc:./logs/gc.log
-XX:MaxMetaspaceSize 设置元空间最大值,JDK1.8开始 -XX:MaxMetaspaceSize=100m
-XX:MetaspaceSize 设置元空间初始值,JDK1.8开始 -XX:MetaspaceSize=100M
-XX:MinMetaspaceFreeRatio 在垃圾收集之后控制最小的元空间剩余容量百分比 -XX:MinMetaspaceFreeRatio=8
-XX:MaxMetaspaceFreeRatio 在垃圾收集之后控制最大的元空间剩余容量百分比 -XX:MaxMetaspaceFreeRatio=8
-XX:InitialTenuringThreshol 设置晋升到老年代的对象年龄的最小值,默认为7 -XX:InitialTenuringThresho=7

二、Serial、Serial Old收集器





















选项 描述 使用示例
-XX:+UseSerialGC 开启Serial收集器。年轻代收集,单线程收集,采用复制算法,默认Client模式默认收集器,对于单核CPU和堆内存小使用效率比较好。缺点是Stop-the-world。 -XX:+UseSerialGC
-XX:+UseSerialOldGC 开启Serial Old收集器。老年代收集,单线程,采用标记整理算法,优缺点和Serial收集器类似。 -XX:+UseSerialO

三、ParNew收集器
















选项 描述 使用示例
-XX:+UseParNewGC 开启ParNew收集器。年轻代收集,多线程,采用复制算法,好处是速度快,可开启多个垃圾线程收集,优点是可并行运行,缺点单核CPU下效率不比Serial收集器快。除了Serial收集器外,目前只有它能和CMS收集器配合工作。它也是使用CMS收集器时默认的新生代收集器。 -XX:+UseParNewGC

四、Parallel Scavenge、Parallel Old收集器




































选项 描述 使用示例
-XX:+UseParallelGC 开启Parallel Scavenge收集器。年轻代收集,采用复制算法,可并行多线程收集器,优点是注重吞吐量,缺点是停顿时间较长,用户体验不太好。 -XX:+UseParallelGC
-XX:MaxGCPauseMillis 最大GC停顿时间(毫秒),虚拟机将尽可能保证回收停顿时间不超过设定值。 -XX:MaxGCPauseMillis=10
-XX:GCTimeRatio 垃圾收集时间占总时间的比值,相当于吞吐量的倒数。例如设置吞吐量19,那最大GC时间就占总时间5%(1/(1+19)),默认值99。 -XX:GCTimeRatio=99
-XX:+UseAdaptiveSizePolicy 自适应调节策略,当打开这个参数之后,JVM会根据运行情况收集性能监控信息,将动态调整这些参数(如-Xmn,-XX:SurivivorRatio,-XX:PretenureSizeThreshold等) -XX:+UseAdaptiveSizePolicy
-XX:+UseParallelOldGC 开启Parallel Old收集器。老年代收集,多线程,采用标记整理算法。优缺点和Parallel Scavenge收集器一样,只是之前老年代收集只有Serial Old收集,所以Parallel Scavenge收集和Serial Old收集组合一起发挥不了吞吐量的优势,所以出现了该收集器。注重吞吐量以及CPU资源敏感的场合,优先考虑Parallel Scavenge+Parallel Old收集器。 -XX:+UseParallelOldGC

五、CMS收集器









































选项 描述 使用示例
-XX:+UseConcMarkSweepGC 开启CMS收集器。老年代收集,多线程,采用标记清除算法,优点是可并行并发处理,注重停顿时间,用户体验更快,缺点是产生浮动垃圾,内存碎片,吞吐量会下降。 -XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction 由于CMS收集存在浮动垃圾,CMS不能等到老年代用尽才进行回收,而是使用率达到设定值就触发垃圾回收。不能设置太高,否则会出现“Concurrent Mode Failure”错误而临时启用Serial Old收集器导致停顿时间加长。 -XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly 开启固定老年代使用率的回收阈值,如果不指定,JVM仅在第一次使用设定值,后续则自动调整。 -XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseCMSCompactAtFullCollection 开启对老年代空间进行压缩整理(默认开启)。由于CMS收集会产生内存碎片,所以需要对老年代空间进行压缩整理。 -XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction 设置执行多少次不压缩的Full GC后,紧接着就进行一次压缩整理(默认为0,每次都进行压缩整理)。 -XX:CMSFullGCsBeforeCompaction=5
-XX:+CMSScavengeBeforeRemark 执行CMS 重新标记(remark)之前进行一次Young GC,这样能有效降低remark时间。 -XX:+CMSScavengeBeforeRemark

六、G1收集器





























































选项 描述 使用示例
-XX:+UseG1GC 开启G1收集器。年轻代和老年代共用,多线程处理,采用标记整理算法,优点是可并行并发处理、分代收集,空间整合、有点回收垃圾多的区域、可预测低停顿;G1收集分四个步骤:初始标记==>并发标记==>最终标记==>筛选回收;G1收集做法是将堆划分大小一样的Region区域,针对具体的区域回收,通过Remembered Set方式避免全堆扫描,每个Region都有对应的Remembered Set,每次Reference类型数据写操作时,JVM产生一个Write Barries进行终端,检查Reference引用的对象是否处于不同的Region之间,如果是,通过Card Table把相关引用信息记录到被引用对象的Remembered Set中,那么进行可达性分析时加入Remembered set记性扫描。 -XX:+UseG1GC
-XX:MaxGCPauseMillis 设置最大GC停顿时间。这是一个软性指标, JVM 会尽量去达成这个指标。 -XX:MaxGCPauseMillis=10
-XX:InitiatingHeapOccupancyPercent 启动并发GC周期时的堆内存占用百分比。G1用它来触发并发GC周期,基于整个堆的使用率而不只是某一代内存的使用比。值为 0 则表示”一直执行GC循环”, 默认值为 45。 -XX:InitiatingHeapOccupancyPercent=70
-XX:ParallelGCThreads 设置垃圾收集器在并行阶段使用的线程数,默认值随JVM运行的平台不同而不同。 -XX:ParallelGCThreads=4
-XX:ConcGCThreads 并发垃圾收集器使用的线程数量。默认值随JVM运行的平台不同而不同。 -XX:ConcGCThreads=4
-XX:G1ReservePercent 设置预留堆大小百分比,防止晋升失败,默认值是 10。 -XX:G1ReservePercent=20
-XX:G1HeapRegionSize 指定每个heap区的大小,默认值将根据 heap size 算出最优解。最小值为 1Mb,最大值为 32Mb。 -XX:G1HeapRegionSize=16M
-XX:InitialSurvivorRatio 设置Survivor区的比例,默认为5。 -XX:InitialSurvivorRatio=10
-XX:+PrintAdaptiveSizePolicy 打印自适应收集的大小。默认关闭。 -XX:+PrintAdaptiveSizePolicy
-XX:G1MixedGCCountTarget 混合GC数量,默认为8。减少该值可以解决晋升失败的问题(代价是混合式GC周期的停顿时间会更长)。 -XX:G1MixedGCCountTarget=8

发表评论

表情:
评论列表 (有 0 条评论,143人围观)

还没有评论,来说两句吧...

相关阅读

    相关 jvm 参数

    JVM参数调优需要基于应用的具体行为来决定,通常涉及到调整内存大小和选择垃圾收集器。这些设置在实际应用部署时非常重要,影响着程序的性能和稳定性。为了深入理解这些参数背后的...

    相关 JVM参数

    堆设置 \-Xss8m 设置栈空间 \-Xms6g :初始堆大小 \-Xmx6g :最大堆大小 \-Xmn5g 年轻代大小 \-XX:NewSize=n :设置年轻代

    相关 JVM参数

    说明 :原文参考蚂蚁课堂余胜军老师。   Java虚拟机原理 所谓虚拟机,就是一台虚拟的机器。他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为系统虚拟

    相关 JVM参数

    不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择[不同的GC策略][GC],调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中

    相关 JVM参数

    前言 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认值 使用jps和jinfo进行查看 -Xms:初始堆空间 -Xmx:堆最大值