jvm GC参数

一部分jvm参数详解网址:http://www.51gjie.com/java/551.html

与gc无关设定

  • -D user.timezone=UTC

    1. 指定时区
      测试服启动指定时区
      JVM运行时增加参数,指定时区
  • -Dfile.encoding=UTF-8

    文件格式

  • -Djava.util.Arrays.useLegacyMergeSort=true

    Arrays.sort方法和Collections.sort(底层也是Arrays.sort)方法被替换了,如果违反了新的排序规则就可能会出现IllegalArgumentException异常(这里是可能,不是一定)。

    之前的方法会忽略掉一种情况,如果想使用之前的方法,这里提供了一个新的参数,java.util.Arrays.useLegacyMergeSort去还原之前的方法。
    最容易出错的情况就是自己写的比较器只写了1和-1的情况,而没有写0,

    如:
    这样会导至当x == y时,compare(x,y)的结果为 -1,此时sgn(compare(x,y)) = -1,这与第一种满足条件sgn(compare(x, y)) == -sgn(compare(y, x))相违背。所以会抛出IllegalArgumentException异常。
    对于 x > y ? 1 : -1 ,当x == y时,也只是可可能会抛出异常,什么会抛出该异常,这要取绝于TimSort算法。

  • -XX:HeapDumpPath=${目录}

    参数表示生成DUMP文件的路径,也可以指定文件名称,例如:-XX:HeapDumpPath=${目录}/java_heapdump.hprof。如果不指定文件名,默认为:java_

gc相关

  • XX:MaxTenuringThreshold

    生存次数达到进入老年代

  • XX:MaxGCPauseMillis – 每次gc暂停时间

    是所有gc暂停时间吗??还是young gc、mix gc

  • -XX:G1HeapRegionSize.

    region 大小,应该2的幂方,建议区域数量接近于2048

    When setting the region size, it’s important to understand the number of regions your heap-to-size ratio will create because the fewer the regions, the less flexibility G1 has and the longer it takes to scan, mark and collect each of them. In all cases, empty regions are added to an unordered linked list also known as the “free list”.

  • G1ReservePercent

    预留内存

  • G1HeapWastePercent

    最小可回收半分比,超过了才进行gc处理

    默认值5%,也就是在全局并发标记结束后能够统计出所有可被回收的垃圾占Heap的比例值,如果超过5%,那么就会触发之后的多轮Mixed GC,mixed gc会同时回收年轻代+老年代,而这个参数可以指定mixed gc触发的时机。而且mixed gc 可以在 gc log中清楚的记录下来。这个参数与InitiatingHeapOccupancyPercent 结合使用的话可以提前回收老年代,让老年代提前释放空间。

    默认5%, gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他 Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的 Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着 本次混合回收就结束了

  • G1MixedGCLiveThresholdPercent-

    一个 区域活对象百分比。低于这个百分比,才能对region回收

    -> 默认85%,region中的存活对象低于这个值时才会回收该region,如果超过这个值,存活对象过多,回收的的意义不大。

  • -Xss

    设置单个线程栈大小,比如-Xss512K,数值越小,一个线程栈里能分配的栈帧就越少,说明可以开启的线程数越多

  • ‐XX:MetaspaceSize

    设置方法区的大小,也是触发GC的阈值,比如

  • ‐XX:MaxMetaspaceSiz

    设置方法区的最大值,比如‐XX:MaxMetaspaceSize=256M

  • -XX:+HeapDumpOnOutOfMemoryError

    参数表示当JVM发生OOM时,自动生成DUMP文件。

  • -XX:MaxGCPauseMillis=150

    设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值

  • -XX:+UseAdaptiveSizePolicy:

    设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。

  • -XX:G1NewSizePercent

    设置新生代初始占比,在系统 运行中,JVM会不停的给年轻代增加更多的Region,但是最多新生代的占比不会超过 60%

  • 可以 通过“-XX:G1MaxNewSizePercent”调整

    年轻代最大占比

  • -XX:+UseConcMarkSweepGC:

    代表垃圾回收策略为并发收集器。

  • XX:G1MixedGCCountTarget

    在一次回收过程中指定做几次筛选回收(默认8次),在最后一个筛选回收阶段可以回收一会,然后暂停回收,恢复系统运行,一会再开始回收,这样可以让系统不至于单次停顿时间过长。

  • -XX:ConcGCThreads=2

  • -XX:InitiatingHeapOccupancyPercent=45

    应该不仅仅是老年代,应该包含年轻代和年老代??,如果这样,那触发频率应该很高啊。

    老年代占用空间达到整堆内存阈值(默认45%),则执行 新生代和老年代的混合收集(MixedGC),比如我们之前说的堆默认有2048个region,如果有接近 1000个region都是老年代的region,则可能就要触发MixedGC了

  • -XX:NewSize=n:

  • ‐Xmn -> 设置年轻代大小,比如‐Xmn2g

    设置年轻代大小

  • XX:NewRatio

  • 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

  • XX:SurvivorRatio

    年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

  • -XX:GCTimeRatio=n:

    设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

  • ‐XX:PretenureSizeThreshold

    可以设置大对象的大小,比如‐XX:PretenureSizeThreshold=100000000 单位为btye。

  • ‐XX:MaxTenuringThreshold

    设置分代年龄,比如‐XX:MaxTenuringThreshold=10 默认为15。

  • ‐XX:-HandlePromotionFailure

    老年代分配担保机制参数,1.8默认开启。

  • ‐XX:-UseAdaptiveSizePolicy

    禁止JVM自动优化eden和Survivor默认比例8:1:1,反之JVM默认有这个参数‐XX:+UseAdaptiveSizePolicy,会导致这个比例自动变化。

  • ‐XX:SurvivorRatio

    设置Eden和Survivor大小比如 ‐XX:SurvivorRatio =8,注意Survivor区有两个。表示Eden:Survivor=8:2,一个Survivor区占整个年轻代的1/10。

  • ‐XX:G1HeapRegionSize

    指定分区大小(1MB~32MB,且必须是2的幂),默认将整堆划分为2048个分区

  • ‐XX:TargetSurvivorRatio

    Survivor区的填充容量(默认50%),Survivor区域里的一批对象(年龄1+年龄2+年龄n的多个年龄对象)总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代

  • -XX:ParallelGCThreads=4:

    配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。

    code
     2、对于并行gc收集器:
     2.1、比如ps的时候:
             -XX:ParallelGCThreads={value} 这个参数是指定并行 GC 线程的数量,一般最好和 CPU 核心数量相当。默认情况下,当 CPU 数量小于8, ParallelGCThreads 的值等于 CPU 数量,当 CPU 数量大于 8 时,则使用公式:ParallelGCThreads = 8 + ((N - 8) * 5/8) = 3 +((5*CPU)/ 8);同时这个参数只要是并行 GC 都可以使用,不只是 ParNew。

             由于GC操作会暂停所有的应用程序线程,JVM为了尽量缩短停顿时间就必须尽可能地利用更多的CPU资源。这意味着,默认情况下,JVM会在机器的每个CPU上运行一个线程,最多同时运行8个。一旦达到这个上限,JVM会调整算法,每超出5/8个CPU启动一个新的线程。所以总的线程数就是(这里的N代表CPU的数目):ParallelGCThreads = 8 + ((N - 8) * 5/8)
             有时候使用这个算法估算出来的线程数目会偏大。如果应用程序使用一个较小的堆(譬如大小为1 GB)运行在一个八颗CPU的机器上,使用4个线程或者6个线程处理这个堆可能会更高效。在一个128颗CPU的机器上,启动83个垃圾收集线程可能也太多了,除非系统使用的堆已经达到了最大上限。

     2.2、cms的时候:
             -XX:ParallelGCThreads 由于是并行处理器,当然也可以指定线程数。
             默认并发线程数是:(ParallelGCThreads + 3)/ 4)

 
     附带:
     1、CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数
     2、总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数
     
     3、相关命令:
     
           3.1、查看CPU信息(型号)[root@AAA ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
     
                   28  Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz 
     
          3.2、查看物理CPU个数 [root@AAA ~]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
     
                   1
     
          3.3、查看每个物理CPU中core的个数(即核数) [root@AAA ~]# cat /proc/cpuinfo| grep "cpu cores"| uniq
     
                   cpu cores : 14
     
         3.4、查看逻辑CPU的个数 [root@AAA ~]# cat /proc/cpuinfo| grep "processor"| wc -l
     
                  12

回收模式相关

  • -XX:+UseG1GC

    使用g1gc

  • -XX:+UseSerialGC:

    代表垃圾回收策略为串行收集器,即在整个扫描和复制过程采用单线程的方式来进行,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,主要在JDK1.5之前的垃圾回收方式。

  • -XX:+UseParallelGC:

    代表垃圾回收策略为并行收集器(吞吐量优先),即在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式。
    此配置仅对年轻代有效。该配置只能让年轻人使用并发收集,而年老代仍旧使用串行收集

  • -XX:+UseParallelOldGC:

    配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集

日志相关

‐ XX:+PrintGCDetails

打印GC日志

‐ XX:+PrintGCTimeStamps

打印GC时间

‐ XX:+PrintGCDateStamps

打印GC日期

‐ Xloggc

将GC日志保存为文件,比如‐Xloggc:./gc.log

    - 使用了参数
-XX:ConcGCThreads=2
-XX:+DisableExplicitGC
-XX:G1MixedGCCountTarget=16
-XX:G1RSetRegionEntries=1024
-XX:+G1SummarizeRSetStats
-XX:G1SummarizeRSetStatsPeriod=1
-XX:GCTimeRatio=4
-XX:+HeapDumpOnOutOfMemoryError
-XX:InitialHeapSize=524288000
-XX:InitialTenuringThreshold=2
-XX:InitiatingHeapOccupancyPercent=45
-XX:MaxGCPauseMillis=150
-XX:MaxHeapSize=3145728000
-XX:MaxTenuringThreshold=2
-XX:-OmitStackTraceInFastThrow
-XX:ParallelGCThreads=4
-XX:+PrintCommandLineFlags
-XX:+PrintFlagsFinal
-XX:+PrintGC
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintStringTableStatistics
-XX:+PrintTenuringDistribution
-XX:StringTableSize=200003
-XX:SurvivorRatio=6
-XX:+UnlockDiagnosticVMOptions
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseG1GC
-XX:-UseLargePagesIndividualAllocation
-XX:+UseStringDeduplication 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值