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使用,显然已经没啥用处了

  • 相关阅读:
    android之View绘制到窗口上的过程
    Java设计模式-回调函数和观察者模式
    Android视图加载到窗口的过程分析
    Android中Handler原理
    第五百二十九天 how can I 坚持
    第五百二十至五百二十八天 how can I 坚持
    第五百一十九天 how can I 坚持
    第五百一十八天 how can I 坚持
    第五百一十七天 how can I 坚持
    第五百一十六天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/bianzy/p/6635796.html
Copyright © 2011-2022 走看看