zoukankan      html  css  js  c++  java
  • JVM调优-GC参数

    一、Throughput收集器(吞吐量)
    -XX:+UseParallelGC
    -XX:+UseParallelOldGC

    *参数调整:通过调整堆大小,减少GC停顿时间,增大吞吐量
    增强堆大小可以减少Full GC频率,但却会增加停顿时间
    1.手动调整
    -Xmn
    -Xms
    -XX:NewRatio=N
    手动指定堆内存大小和代空间比例,一般要多次试验
    2.自动参数调整
    -XX:MaxGCPauseMillis=N 可接受最大停顿时间
    -XX:GCTimeRatio=N 可接受GC时间占比(目标吞吐量) 吞吐量=1-1/(1+N)
    步骤:
    1.MaxGCPauseMillis优先级高,JVM会自动调整堆大小和代空间值,以期满足MaxGCPauseMillis
    2.当MaxGCPauseMillis满足后,JVM会增大堆大小,直到满足GCTimeRatio
    3.当MaxGCPauseMillis和GCTimeRadio都满足后,JVM会尽可能以最小堆大小来实现这两个指标参数
    Throughput一般不考虑响应时间,所以一般不设置-XX:MaxGCPauseMillis

    一般吞吐量在95%以上就算比较好的了,对于可用内存很少的环境可以降低指标

    二、CMS收集器(响应时间)
    -XX:+UseParNewGC
    -XX:+UseConcMarkSweepGC
    CMS收集器会对年轻代进行并发GC, 会有stw(stop-the-world)
    CMS收集器会对老年代进行并发GC, CMS
    如果有必要,CMS会发起单线程的Full GC, 这个操作十分耗时

    Full GC原因:
    并发模式失效:新生代发生GC时,老年代没有足够内存容纳晋升对象
    晋升失败:老年代虽然有足够容纳晋升对象的内存,但内存都是碎片,导致晋升失败

    *参数调整:避免并发模式失效和晋升失败
    -XX:+UseCMSInitiatingOccupancyOnly 根据Old内存使用阈值决定何时CMS, 默认是false,会用更复杂的算法决定何时CMS
    -XX:CMSInitingOccupancyFraction=N default N=70,老年代内存使用70%时就发生CMS
    N设置太大,容易并发模式失效;N太小,CMS过于频繁,而CMS也会导致stop-the-world
    -XX:ConGCThreads=N GC的线程会100%占用CPU,如果发生并发模式失败,而N还小于CPU核心数,此时可以增加N。
    如果没有发生并发模式失败,此时可以减少N,以让应用程序有更多CPU执行

    Perm持久代GC调优
    持久代内存满了会引发Full GC
    持久代GC调优主要是让持久代也进行CMS收集
    -XX:+CMSPermGenSweepingEnable 使持久代使用CMS收集器
    -XX:+CMSClassUnloadingEnable 使持久代能真正释放不再被使用的类。默认是不会释放类的元数据的

    增量式CMS:普通CMS线程会占用100%的cpu负载,增量式CMS会让出一定CPU负载给应用线程
    这适合在单核CPU使用,显然已经没啥用处了

  • 相关阅读:
    POJ3320 Jessica's Reading Problem
    POJ3320 Jessica's Reading Problem
    CodeForces 813B The Golden Age
    CodeForces 813B The Golden Age
    An impassioned circulation of affection CodeForces
    An impassioned circulation of affection CodeForces
    Codeforces Round #444 (Div. 2) B. Cubes for Masha
    2013=7=21 进制转换
    2013=7=15
    2013=7=14
  • 原文地址:https://www.cnblogs.com/bianzy/p/6635796.html
Copyright © 2011-2022 走看看