zoukankan      html  css  js  c++  java
  • RegionServer 的JVM 垃圾回收优化

    1、为何HMaster一般不需调整垃圾回收机制

    HMaster 没有处理过重的负载,并且实际的数据服务不经过 HMaster,所以垃圾回收时 HMaster 通常不会产生问题。


    2、描述JRE的启发式算法

    JRE 在默认情况下会按照一般情况下来估计程序在做什么、怎么创建对象、如何分配堆内存处理数据,这些假设在多数情况下都是对的。JRE能够运用启发式算法,根据运行进程的状况进行调整。设置当启发式的学习调整受限于具体实现时候,JRE 也能够更好地处理某些特殊情况。


    3、为何需要调整RegionServer 的垃圾回收机制

    JRE的默认算法和启发式学习调整功能不能很好地处理RegionServer。当RegionServer 在写入量过大的负载时候,繁重的负载使得JRE通过对程序行为的各种假设进行内存分配的策略不再有效。

    在RegionServer写入数据时,数据会先保存在memstore 中,当大于阈值时候,再写入到磁盘。因为写入的数据是由客户端在不同时间写入的,故而他们占据的Java堆空间很可能是不连续的,会出现孔洞。


    4、RegionServer的新生代和老生代的特点比较

    新生代大小在128M~512M;老生代大小在几GB。

    最初写入的数据会保存在新生代,再刷写到磁盘;当数据刷写到磁盘的速度较慢时候,新生代中的数据停留时间过长,会被移到老生代。

    新生代空间可以被迅速回收,对内存管理没有影响;老生代数据量大,回收慢,对内存管理影响大。所以二者需要不同的垃圾回收策略。


    5、RegionServer 的JVM 配置解读

    -Xmx8g -Xms8g -Xmn128M -XX:+UseParNewGC -XX:+UseConMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XLoggc:/logs/gc-hostname.log


    其中:

    -Xmx8g           最大堆内存8g


    -Xms8g           初始堆内存设置与最大堆内存一样大。如果Xms设置得比较小,当遇到数据量较大时候,堆内存会迅速增长,当上升到最大又会回落,伸缩堆大小会带来压力。


    -Xmn128M      新生代128M。新生代不能过小,否则新生代中的生存周期较长的数据会过早移到老生代,引起老生代产生大量内存碎片;新生代也不能过大,否则回收新生代也会造成太长的时间停顿,影响性能。


    -XX:+UseParNewGC    新生代采用 ParallelGC 回收器。ParallelGC 将停止运行Java 进程去清空新生代堆,因为新生代很小,所以停顿的时间也很短,需几百毫秒。  


    -XX:+UseConMarkSweepGC    老生代采用CMS回收器(Concurrent Mark-Sweep Collector) .  CMS 在不停止运行Java进程的情况下异步地完成垃圾回收,CMS会增加CPU的负载,但是可以避免重写老生代堆碎片时候的停顿。老生代回收不可使用 ParallelGC  回收机制,因为老生代的堆空间大,ParallelGC会造成Java进程长时间停顿,使得RegionServer与ZooKeeper的会话超时,该RegionServer会被误认为已经奔溃并会被抛弃。


    -XX:CMSInitiatingOccupancyFraction=70     初始占用比为70%的时候开始CMS回收。此值不能太小,否则CMS发生得太频繁。此值不能太大,否则因为CMS需要额外堆内存,会发生堆内存空间不足,导致CMS 失败。


    -verbose:gc -XLoggc:/logs/gc-hostname.log     写入日志



    6、串行收集器(Serial Collector)、并行收集器(Parallel Collector)、并发标记清理收集器(CMS)

    串行收集器(Serial Collector)  -XX:+UseSerialGC 

    Serial Collector使用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高。但是,也无法使用多处理器的优势,所以Serial Collector 适合单处理器机器。当然,此收集器也可以用在小数据量( 100M ]左右)情况下的多处理器机器上。 


    并行收集器(Parallel Collector) -XX:+UseParallelGC    -XX:+UseParallelNewGC   -XX:+UseParallelOldGC

    多条垃圾收集线程并行,此时用户线程是没有运行的.

    --适用情况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。
    --缺点:应用响应时间可能较长


    并发标记清理收集器(CMS)   XX:+UseConcMarkSweepGC

    用户线程与垃圾收集线程并发执行,程序在继续运行,而垃圾收集程序运行于另一个个CPU上.

    可以保证大部分工作都并发进行(应用不停止),垃圾回收只暂停很少的时间,此收集器适合对响应时间要求比较高的中、大规模应用。使用-XX:+UseConcMarkSweepGC 打开。

    -适用情况:“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。

    --缺点:需要消耗更多资源,吞吐量没那么大



  • 相关阅读:
    LeetCode "Median of Two Sorted Arrays"
    LeetCode "Distinct Subsequences"
    LeetCode "Permutation Sequence"

    LeetCode "Linked List Cycle II"
    LeetCode "Best Time to Buy and Sell Stock III"
    LeetCode "4Sum"
    LeetCode "3Sum closest"
    LeetCode "3Sum"
    LeetCode "Container With Most Water"
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276316.html
Copyright © 2011-2022 走看看