博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4. 垃圾回收- 4.3垃圾收集器
阅读量:5279 次
发布时间:2019-06-14

本文共 1311 字,大约阅读时间需要 4 分钟。

下面一张图是HotSpot虚拟机包含的所有收集器,图是借用过来滴:

  • Serial收集器(复制算法)
    新生代单线程收集器,标记和清理都是单线程,优点是简单高效。是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定。
  • Serial Old收集器(标记-整理算法)
    老年代单线程收集器,Serial收集器的老年代版本。
  • ParNew收集器(停止-复制算法) 
    新生代收集器,可以认为是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现。
  • Parallel Scavenge收集器(停止-复制算法)
    并行收集器,追求高吞吐量,高效利用CPU。吞吐量一般为99%, 吞吐量= 用户线程时间/(用户线程时间+GC线程时间)。适合后台应用等对交互相应要求不高的场景。是server级别默认采用的GC方式,可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数。
    • Parallel Old收集器(停止-复制算法)
      Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量优先。
    • CMS(Concurrent Mark Sweep)收集器(标记-清理算法)
      高并发、低停顿,追求最短GC回收停顿时间,cpu占用比较高,响应时间快,停顿时间短,多核cpu 追求高响应时间的选择。
    • CMS 和G1的垃圾回收器的原理,阿里的面试官也问过,我专门做了专题:
       
     

GC是什么时候触发的(面试最常见的问题之一)

  由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:Scavenge GC和Full GC。

Scavenge GC

  一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。

Full GC

  对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致Full GC:

    a) 年老代(Tenured)被写满;

    b) 持久代(Perm)被写满;

    c) System.gc()被显示调用;

    d) 上一次GC之后Heap的各域分配策略动态变化;

 

下一篇

 

原文链接:https://www.cnblogs.com/aspirant/p/8662690.html

转载于:https://www.cnblogs.com/wangfajun/p/9916339.html

你可能感兴趣的文章
qsort函数用法
查看>>
angular脏值检测策略
查看>>
centos 7 安装vlc
查看>>
HPUX 配置zabbix开机自动启动
查看>>
纯CSS实现3D按钮效果
查看>>
上海云栖—人工智能-视觉计算专场预热
查看>>
【BZOJ 4151 The Cave】
查看>>
MySQL数据备份之mysqldump使用
查看>>
Jsoncpp学习二---读取Json格式的文本文件
查看>>
java推送数据到app--极光推送
查看>>
C#面试分享:单例模式
查看>>
hdu 2199 Can you solve this equation?
查看>>
P1083 借教室
查看>>
(四)工厂方法模式详解(另附简单工厂的死亡之路)
查看>>
ASP.NET MVC 3.0学习系列文章--序
查看>>
Daemontools和Supervisor管理linux常驻进程
查看>>
双显示屏下主显示屏任务栏不见了
查看>>
学Java的第30天 异常
查看>>
docker修改国内官方镜像
查看>>
如何验证二维数组
查看>>