JVM重点简述—分代收集理论与垃圾收集算法

一、分代收集理论

设计原则:将java堆划分为不同区域,将回收对象依据年龄分配到不同区域存储。由此产生新生代和老年代的概念,新生代每次手机都会有大批对象死去,存活的少量对象逐步晋升为老年代。

三条假说

(一)绝大多数对象都是朝生夕死的
(二)熬过越多次垃圾回收的对象就越难以消亡
(三)跨代引用相对于同代引用来说,仅占少数

二、垃圾收集算法

1.标记-清除算法(最早最基础)

过程:首先,标记所需回收的对象,(标记过程就是对象是否属于垃圾的判定过程)

之后。统一回收所有标记的对象。

缺点:(一)、执行效率不稳定。

(二)、内存空间碎片化问题。

2.标记-复制算法(新生代)

过程:将可用内存按容量划分为大小相等的两块,每次只是用一块,当一块内存使用完后,就把存活的对象复制到另一块上,再把已使用过的内存空间一次清理掉。

但是为了收集垃圾,将内存的使用量降低一半,成本较高。所以,不会1:1划分边界,可以分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden空间和一块Survivor。当回收时,将Eden和Survivor中还存活的对象一次性的复制到另一块Survivor上,最后清理Survivor和Eden空间。大小比例一般为8:1:1,每次浪费10%的空间。但有一个问题值得注意,如果存活的对象大于10%怎么办?采用一种内存分配担保策略:多出来的对象直接进入老年代。

缺点:将可用内存缩小为原来的一半,空间浪费太多。

3.标记-整理算法(老年代)

过程:标记过程与清除算法一样,但后续步骤是让所有存活的对象向内存空间一端移动,然后直接清理掉边界以外的内存。

整理与清除算法的差异:整理算法基于移动式,内存回收更复杂;清除算法基于非移动式,内存分配更复杂。

三、常见的垃圾收集器

如果说算法收集算法是方法论,那么垃圾收集器就是内存回收的具体实现。

垃圾收集器主要有:Serial,Serial Old,ParNew,Parallel Scavenge,Parallel Old,CMS,G1。

新生代

1.Serial收集器:单线程收集器,不仅仅意味着他只会使用一条线程去完成垃圾收集,重要的是他在垃圾收集过程中,必须暂停其他所有工作线程,直到他收集结束。但是他简单而高效,额外的内存消耗最小;由于没有线程交互,垃圾收集效率也很高。

2.PerNew收集器:是Serial的并行版本,可同时使用多线程进行垃圾收集。

3.Perallel Scavenge收集器:是一个新生代,基于标记-复制算法,并行的多线程收集器。

更侧重于吞吐量(处理器用于运行用户代码的时间/运行用户代码的时间+运行垃圾收集时间)。

高吞吐量:可以最高效率的利用处理器资源,尽快完成程序的运算任务。

老年代

4.Serial Old收集器(标记-整理):Serial的老年代版本,单线程收集器。

5.Parallel Old 收集器(标记-整理):多线程并发收集,注重吞吐量和处理器资源间的配合,适用于cpu资源紧缺的情况。

6.CMS收集器(标记-清除):一种以获取最短收集停顿时间为目标的收集器,符合在注重用户体验的应用上使用。整个过程有四个步骤:初始标记,并发标记,重新标记,并发清除。(Spark streaming采用这个,最少的停顿)

初始标记:暂停所有线程,并记录下与GRoots相连的对象,速度很快。

并发标记:同时开启GC和用户线程,从GCRoots继续向下标记,但是用户线程也会继续更新引用对象的引用域。

重新标记:该阶段是为了修正并发标记期间因为用户程序运行而导致标记产生变动的那部分对象的标记记录,这个阶段停顿时间比初始时间略长,但是远远短于并发标记区间。

并发清除:开启用户线程,同时GC线程开始对未标记的区域做清扫。

优点:并发清除,低延迟。

缺点:1.采用标记-清除,会产生碎片。2.无法处理浮动垃圾,即在并发阶段,用户线程继续运行所产生的垃圾,只能等下次GC处理。3。对CPU非常敏感,由于存在并发阶段,所以系统总吞吐量会降低。

7.G1收集器(标记-整理)

唯一一个同时用于新生代和老年代的垃圾收集器。

G1的思想:不分代,面向对内存任何部分回收,哪块内存存放垃圾最多,回收收益就最大。

G1的过程:(一)把java堆划分为多个大小相等的Region块,每个Region用一个rememberSet记录引用关系

(二)在后台维护一个优先级列表,根据允许的垃圾收集停顿时间,优先处理价值最大的Region

价值即为:回收所获得的空间大小和回收所获得的时间。

注意:rememberSet的本质是哈希表,key是引用Region的起始地址,value是一个集合,存储卡表的索引号。

特点:并发性强,分代收集,标记整理进行空间整合,可根据用户设置期望回收停顿时间。目的是延迟可控下,获得尽可能高的吞吐量。

G1相对于CMS的比较:可以指定最大回收停顿时间。

                                       分Region的内存布局。

                                        按照收益动态的去顶回收集。

                                        不会差生内存空间碎片。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值