宝玛科技网
您的当前位置:首页垃圾收集器参数配置

垃圾收集器参数配置

来源:宝玛科技网

上篇文章粗略介绍了jdk8及以下版本中的常见的垃圾回收器:,这篇文章来列一下在对应的收集器都有哪些参数配置。

通用配置

选项

描述

使用示例

-Xms

设置Java堆的初始大小。当可用的Java堆区内存小于40%时,JVM就会将内存调整到选项-Xmx所允许的最大值

-Xms100M

-Xmx

设置Java堆的最大值。当可用的Java堆区内存大于70%时,JVM就会将内存调整到选项-Xms所指定的初始值。与-Xms设置为一样的话可以避免堆自动扩展带来的性能开销。

-Xmx300M

-Xss

设置栈容量大小。每个线程都拥有一个栈,生命周期与线程相同,每个方法的调用都会创建一个栈帧。在堆容量确定的情况下,栈容量越大意味着能建立的线程越少。

-Xss2M

-Xmn

设置新生代的大小。-Xmn的内存大小为Eden+2个Surivivor空间的值,官方建议配置为整个堆的3/8。

-Xmn100M

-XX:NewSize

设置新生代的初始大小。和-Xmn等价,推荐使用-Xmn,相当于一次性设定了NewSize与MaxNewSize的内存大小。

-XX:NewSize=100M

-XX:MaxNewSize

设置新生代的最大值

-XX:MaxNewSize=100M

-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:+DisableExplicitGC

是否关闭手动System.gc

-XX:+DisableExplicitGC

Serial收集器

选项

描述

使用示例

-XX:+UseSerialGC

开启Serial收集器。
年轻代收集,单线程收集,采用复制算法,默认Client模式默认收集器,对于单核CPU和堆内存小使用效率比较好。
缺点是Stop-the-world。

-XX:+UseSerialGC

ParNew收集器

选项

描述

使用示例

-XX:+UseParNewGC

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

-XX:+UseParNewGC

Parallel Scavenge收集器

选项

描述

使用示例

-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

Serial Old收集器

选项

描述

使用示例

-XX:+UseSerialOldGC

开启Serial Old收集器。
老年代收集,单线程,采用标记整理算法,优缺点和Serial收集器类似

-XX:+UseSerialOldGC

Parallel Old收集器

选项

描述

使用示例
-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

 

 

转载于:https://my.oschina.net/dslcode/blog/3007693

因篇幅问题不能全部显示,请点此查看更多更全内容