jvm--垃圾收集器与内存分配策略,GI,CMS(垃圾回收算法)(二)

概述

垃圾收集,很多人认为,是java语言的伴生,在《深入理解java虚拟机》第二版里面,开头说,GC历史比java久远。
首先要在垃圾收集器之前要知道,什么内存要回收,什么时候回收,如何回收。
在java堆和方法区跟线程里面的回收是不一样的,一个接口里面的多个实现类需要的内存也可能不一样,这些里面的内存都是动态的,垃圾收集器就是关注这部分内容的。

对象已死吗?

如何判定对象应该被回收?
引用计数算法 给对象添加一个计数器,
卡达性分析算法(目前主流)通过一系列的称为GC ROOTS的对象为起点,往下搜索,搜索的路径称为引用链
在这里插入图片描述

GC的根(虚拟机栈中引用的对象,方法区中类静态属相引用的对象,方法区中常量引用的对象,本地方法栈中的JNI(Native方法)引用的对象)
4种引用
强,如Object obj = new Object(),一般有这个引用就永远不会被回收
软,描述一些还有用但是非必须的对象,在系统内存溢出之前回收
弱,下一次回收之前就回收掉,在GC收集器工作的时候无论当前内存是否足够,都会回收掉只被弱引用关联的对象
虚,就跟一个眼看着一样,在对象回收时收到一个系统通知

垃圾回收算法

标记清除算法,先标记在清除,效率不高,清理完成后产生大量的不连续的内存碎片,以后分配大的对象的时候,无法找到足够的连续内存而不得不提前触发另一侧处理。
复制算法,内存只能占一半,把内存一分为二额,一半满了,就吧不回收的放到另一边,然后全部清除了,高效,但是代价太高,但是现在hotSpot虚拟机eden和survivor(幸存者)的大小比例是8:1,新生代可用的有百分之九十,只用百分之10会被“浪费”,当回收时有多于10%的对象存活,需要依赖其他内存(老年代)进行分配担保;
标记整理算法和标记清除一样,清除完了后让所有的存活的对象向一边移动,清理边界以外的内存
分代收集算法,吧java堆分成新生代和老年代,新生代用复制算法,老年代用标记-清除和标记-整理回收

垃圾收集器

serial收集器
,运行的时候会停止,单线程,体验不好,但是简单高效,在虚拟机运行Client模式下是默认的新生代收集器,在这里插入图片描述
ParNew收集器
是Serial收集器的多线程版本,目前只有ParNew可以和CMS收集器配合工作
在这里插入图片描述

并行
多条垃圾收集线程并行工作,用户线程仍处于等待状态
并发
用户线程用户线程与垃圾收集线程同时执行,不一定是并行的,有可能是交替进行的,用户程序继续运行,垃圾收集器在另一个cpu上面运行
Parallel Scavenge 收集器
新生代收集器,采用了复制算法,并行的多线程收集器,这个收集器的目标不是缩短垃圾收集用户线程的的停顿时间,而是达到一个可以控制的吞吐量

吞吐量=运行用户代码的时间/(运行用户代码的时间+垃圾收集时间)

Serial Old 收集器
, 是Serial收集器是老年代版本,单线程,用标记-整理算法
在这里插入图片描述
Parallel Old 收集器
是Parallel Scavenge的老年代版本,多线程和标记整理算法,在注重吞吐量和cpu资源的场合,可以用Parallel Scavenge 加 Parallel Old
在这里插入图片描述

CMS收集器

是一种以获取追短回收停顿时间为目标的收集器,基于标记-清除算法实现的,
优点,并发收集,低停顿但是无法处理浮动垃圾。然后也是使用的标记-清除算法实现的收集器,如果空间碎片太多,可能会给大对象分配产生麻烦
过程
初始标记
并发标记
重新标记
并发清除
总体上cms收集器的内存回收与用户线程一起并发执行
在这里插入图片描述

GI 收集器

面向服务端应用的垃圾收集器,通过并发方式,让java程序继续运行。并且可以分代收集,空间整合(标记-整理)可预测停顿,
过程:
初始标记
并发标记
最终标记
筛选回收
在这里插入图片描述

对象优先在Eden分配

多数情况下,对象在新生代的Eden区分配,当Eden区没有足够空间的时候,虚拟机将发起一次Minor GC,

MinorGC :新生代GC,
指的是在新生代的垃圾收集动作,因为java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,回收速度也比较快

Major GC
老年代GC,比新生代的一般会慢10倍左右

大对象直接进入老年代

大对象是指需要大量联系内存空间的java对象,比如很长的字符串以及数组,经常出现大对象容易导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续空间来“安置”,

长期存活的对象也会进入老年代,虚拟机给每个对象定义了应该对象年龄计数器,当对象晋升老年代的年龄阈值,就会进入老年代。

动态对象年龄判定,如果在survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一般年龄大于或等于该年龄一半的对象可以直接进入老年代。

空间分配担保,在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所以对象总空间,成立,可以确保 Minor GC可以确保是安全的,不成立,担保失败。

结语
最近在狂补一些java的理论知识,所以每天坚持总结和积累,明白了很多以前只会用的知识,备战秋招,加油了(图片看见了csdn上面的好玩的粘贴下来的,上面的插图是在深入理解java虚拟机里面的截图的
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值