垃圾回收机制

目录

自动垃圾回收

在这里插入图片描述

如何确定内存需要被回收

标记用来识别哪些内存正在使用,哪些不再使用。
引用计数:会有循环引用的问题。A和B相互引用,但实际上都没有被使用到。
方法区回收:在类加载中类被卸载。
在这里插入图片描述

可达性分析算法

把对象和引用看作一个关系图。找到一个能到作为入口对象,通过这个对象进行标记,然后进行回收。
JVM会维护一个GC Root,如果一个对象通过GC Root找不动,那么就可以被回收。
JVM在做垃圾回收的时候要标记,找出所有可以被作为GC Root的对象,把所有正在使用的标记出来。在这里插入图片描述

引用类型可达性级别

堆外内存类似于虚引用。
在这里插入图片描述

垃圾收集算法

标记-清楚:内存碎片化。改进为复制算法。
标记-复制算法:可以解决内存碎片化的问题,但是会造成空间浪费。
标记-整理:对象移动。在这里插入图片描述

分代收集

主流JVM实现都是分代收集方式。
新生代划分为三个区:S0:S1:Eden 分配比例:1:1:8
新生代:老年代 占用比例-》1:2
新生代进行复制算法。新生代回收过程:
新生对象放入Eden区,将存活的对象放入S0,并记录经历的垃圾回收次数,S0(幸存者)满了,Eden也满了,然后在进入S1,继续标记回收的次数,在S1和S2进行相互转移,在S0和S1标记一定的次数(次数可以指定)之后,认为是持久存活,就会进入老年代。
新生代内存不够,会直接进入老年代。
大对象会直接进入老年代,复制算法会影响性能。

老年代标记整理算法老年代回收过程
标记之后清除,再做整理,避免内存碎片问题。

针对不同的区域采取不同的算法,从而最大提高性能。
新生代回收图:

在这里插入图片描述
老年代回收图:
在这里插入图片描述

垃圾收集器

具体来做标记、垃圾回收的执行者。
串行收集器 Serial
串行:单个线程来执行标记、清楚、整理的操作。这种收集器有新生代串行收集器和老年代串行收集器,算法会不一样。
灰色线程:用户线程 棕色:GC线程 。
stop-the-world:GC工作的特性,会停掉用户的线程,等GC做完任务之后,用户线程才会执行。
由此带来的问题:不能一边清楚垃圾,一边生成垃圾。使用比较少,不适合多核服务器。
在这里插入图片描述
并行收集器 Parallel
特点是将单线程编程多线程,但是stop-the-world还是存在的,时间很短,一般感觉不到。
可以设置很多属性,进行调整优化。
设置停顿时间:JVM会尽力满足这个时间要求。
在这里插入图片描述
并发收集器 CMS (Concurrent Mark Sweep)
专用老年代,目的是尽量坚守停顿时间。一边执行用户线程,一边执行GC。
使用的是标记清除算法
初始标记:还是会导致STW,标记完之后进行清除,存在内存碎片化的问题,长时间运行会导致全局GC(Full GC),对全局堆内存进行GC的过程,找出root。
并发标记:GC线程和用户线程一起执行。
并不是所有的过程都是和用户线程一起执行的。
重要优化是尝试和用户线程一起执行。
官方已放弃维护。
在这里插入图片描述
并行收集器 ParNew GC
配合老年代CMS GC工作。
专门针对新生代实现,通过多线程回收新生代。
在这里插入图片描述
并发收集器 G1
完全不同的分代方式,每一个区域可以是新生代和老年代,新生代也会有S0,S1等概念。
整体上是标记整理的算法。
虽然是并发,但还是会有STW。
把每一个小的区域做单独的管理,分而治之
在这里插入图片描述

垃圾收集器组合

七种垃圾回收器,有作用在新生代,有作用于老年代的。
G1两者兼容,新的垃圾收集器,暂无广泛的使用。
默认组合是:Parallel+Parallel Old并行收集器。
更多的是选择默认。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值