JVM: 调优参数设置
一、通用参数
选项 | 描述 | 使用示例 |
---|---|---|
-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 |
还没有评论,来说两句吧...