zoukankan      html  css  js  c++  java
  • 详解常见的垃圾收集器

    常见的垃圾收集器分为串行、吞吐量优先和响应时间优先三种。

    串行:Serial

    设置参数为  -XX:+UseSerialGC = Serial + SerialOld,Serial分为两种,Serial工作在新生代,使用复制算法;SerialOld工作在老年代,采用标记整理算法。

      假设有4核CPU运行四个线程,在GC时对象的地址可能会发生变化,要发生GC时,让所有用户线程到达一个安全点停下来,垃圾回收线程开始回收,回收期间其他线程被阻塞。如果用户线程不停下来,GC时对象地址变化了,就会产生问题。垃圾回收线程结束以后,其他线程再开始运行。适合堆内存小、个人电脑使用

    吞吐量优先:Parallel Scavenge

    这是1.8 默认的GC器 ,主要设置的参数为:

    -XX:+UseParallelGC ~ -XX:+UseParallelOldGC 新生复制,老年标记整理

    -XX:+UseAdaptiveSizePolicy 自适应调整新生代大小

    -XX:GCTimeRatio=ratio 公式 1 / (1 + ratio) ratio默认值是99 ,也就是工作100分钟内,只有1分钟可以用于垃圾回收。如果达不到整个目标,ParallelGC会调增大堆的大小, 垃圾回收次数减少 ,以此来提高吞吐量。一般ratio设置为19。

    -XX:MaxGCPauseMillis=ms 最大暂停时间也就是垃圾回收的时间,默认200ms

    -XX:ParallelGCThreads=n 控制垃圾回收线程数量

      工作流程与串行的区别是开启多个垃圾回收线程来回收,数量由电脑的CPU核数决定,同样用户线程被阻塞。特点是多线程收集,让单位时间内STW时间最短 即收集次数少时间可以长点,比如一小时内2次,一次0.2秒。

     响应时间优先:CMS

    设置的参数为:

    -XX:+UseConcMarkSweepGC ~ -XX:+UseParNewGC ~ SerialOld --> CMS工作在老年代,使用标记清除算法。ParNew工作在新生地,ParNew是Serial的多线程版本。但CMS有时候会发生并发失败问题,这时候老年代垃圾回收器变为SerialOld 。

    -XX:ParallelGCThreads=n ~ -XX:ConcGCThreads=threads:并发线程数一般设置为并行线程数的1/4,比如4核就设置成1。1个线程来做垃圾回收,另外3个继续执行用户线程。

    -XX:CMSInitiatingOccupancyFraction=percent 执行CMS回收的内存占比,值越小执行垃圾回收时机越早。

    -XX:+CMSScavengeBeforeRemark 在重新标记前做一些新生代的垃圾回收。因为重新标记时,新生代的对象会引用老年代的对象,标记时需要扫描整个堆,然后通过新生代引用扫描到老年代对象并作可达性分析。这种场景下新生代对象非常多并且很多会作为垃圾对象被回收,再根据新生代对象引用找到老年代对象;相当于在回收之前多做了无用的查找,这时可以使用这个参数,使用新生代存活对象变少,减轻重新标记的压力。

      工作流程是假设4核CPU并行执行4个线程。老年代内存不足,用户线程在安全点停下来了。先进行初始标记,标记一些GCroots对象,这时候用户线程被阻塞。下一步是并发标记,用户线程和垃圾回收线程并发执行。第三步是重新标记,因为并发标记时用户线程继续执行,可能会产生新的对象,或者改变对象的一些引用。最后是并发清理,但这次清理不能回收同时产生的垃圾对象(浮动垃圾),浮动垃圾只能等到下一次垃圾回收时再清理,使用上面第三个参数调整。

      CMS使用的标记清楚算法,自然会产生大量内存碎片。将来分配对象时,当新生代内存不够时,老年代内存由于碎片过多也不足,就会造成并发失败,这时候垃圾回收器会退化为SerialOld,垃圾回收时间会剧增。

  • 相关阅读:
    谬论之程序猿的眼光看世界
    phpStudy-坑爹的数据库管理器-phpMyAdmin的默认用户名和密码
    解决Delphi 2010启动时出现cannot create xxxxEditorLineEnds.ttr问题
    数据库中增加操作insert into的用法和查询select的用法
    TRichEdit怎样新增的内容到最后一行?
    BCB将RichEdit光标移到最后一行
    怎么把焦点放在RichEdit的最后一行
    Panel自动变颜色
    怎么判断pagecontrol下的TabSheet是否打开还是关闭求答案
    用Setup Factory7.0怎样打包delphi的BDE?
  • 原文地址:https://www.cnblogs.com/fly-bryant/p/13377840.html
Copyright © 2011-2022 走看看