jvm学习笔记,垃圾回收算法(一.基本垃圾回收算法介绍)

文章目录

    • 为什么要学习垃圾回收算法
    • jvm回收的对象
    • 引用计数
    • 标记删除法
    • 复制算法
    • 分代收集算法

为什么要学习垃圾回收算法

在我们日常的开发中,我们随心所欲的创建一些对象,然后这些对象的创建与最终的销毁与内存的回收等,都是jvm帮我们实现的, 但是作为一个程序员不想一直搬砖的话,怎么能对这些底层的原理了解清楚呢,
当我们学习了垃圾回收算法后,

1.可以在大型的项目中去利用一些工具去实时的监控虚拟机内部的内存分配,找到bug的所在,不至于对着ide的一堆报错一脸懵逼
2.可以了解底层jvm的运行原理,这样才能写出高质量的代码,到时候一样的业务代码,你的就是比别人效率高
3.可以根据你项目的具体需要与硬件设施,来选择对应的垃圾回收算法,从而优化项目

jvm回收的对象

1.首先我们要确定有哪些对象需要回收
在java程序的运行时,会产生许多类型的对象(或称为数据),有编译时就确定的常量,有类,有对象等;然后当我们通过某种方式确定这个对象不会在被任何一个对象所使用了,这个时候就到了它被废弃的时候了,这个时候就该jvm回收它了

2 . 在哪里回收对象
经过研究发现,常量一般不会经常被遗弃,还有经常被"使用"(被人引用也是一种使用)的class也不会被立刻遗弃(时间局部性),等等,我们无论哪种回收算法都是比较消耗耗时的,我们就将这些不会经常变化的对象存放在一个特定的区内**,命名为老年代**,然后不会经常对其进行回收,从而减少回收算法的负担,那些新创建出来的对象,生命经常是短暂的,所以这些对象,我们就放进另一个区内,命名为新生代,经常对新生代进行回收

引用计数

首先我们先介绍一下最简单的引用计数法,它的原理是这样的,每个对象都设置一个引用数用来存放这个对象被使用的数量,当一个对象被被别的对象使用或者引用的时候将这个对象的引用数加一,当jvm进行垃圾回收时会去检查每个对象的引用数,当引用数,即这个对象没有被任何对象使用,就将这个对象进行回收

优点

1.实现简单
2.花费时间较短,因为根据引用计数的方式,每一个废弃的对象都是立即回收的,所以操作时较短

缺点

1.当对象的引用发生变化时,必须l对引用计数进行对应的增删,否则会发生内存泄漏
2.不利于多线程处理,在进行并行作业的时候,容易同时对引用计数进行操作,所以需要进行一个加锁的等操作保障线程安全
3.无法释放循环引用的对象,例如 对象a引用了对象b,对象b也引用了对象a这时候两个对象的引用数都是1,不能被回收,但是对象a与b都应该被回收时,就是发生内存泄漏,a与b永远都存都存活在内存中

标记删除法

分两次进行遍历

1.第一次遍历,从根节点进行遍历,将被引用或使用过的节点进行标记
2.第二次遍历,从根节点进行遍历,将没有标记的对象进行回收,将有标记的对象的标记去除,方便下一次标记删除

标记过程如下
jvm学习笔记,垃圾回收算法(一.基本垃圾回收算法介绍)_第1张图片
优点

1.实现简单,两次遍历就可以实现了

缺点:

当出现只有少量对象存活,大部分需要回收时,在标记删除的第二步还要遍历这些废弃对象,效率较低

标记清除算法还有一种改良,叫标记整理法

它在标记清楚法上面进行改进,对废弃的对象不是直接回收,而是先将没有废弃的对象先向前挪,等所有对象挪完以后,再将整块内存后面的部分进行回收
jvm学习笔记,垃圾回收算法(一.基本垃圾回收算法介绍)_第2张图片

优点

避免了内存的碎片化,得到了一块物理地址连续的大内存

缺点

操作较复杂,在存活对象较多时,效率低下

复制算法

分两块空间,一块存放所有需要评估是否回收的对象,命名为旧空间,一块作为备份空间,命名为新空间垃圾回收时
1.遍历旧空间,将所有不需要回收的对象复制到新空间内
2.将旧空间整体回收,这样清理干净的旧空间就成了新的新空间,原来的新空间就成了就旧空间

优点

因为在进行第一步的复制时,会将引用的对象放置在一起,所以在程序使用这些对象的很有可能会使用与它们相关的对象(空间局部性),这样会减少磁盘寻道时间

缺点

在存活对象较多的时候,因为要复制大量得到对象至新空间,效率较低

分代收集算法

根据回收对象的划分,将java对象的存放区分为新生代与老年代,因为局部性原理所以老年代被回收的概率较小,只用频繁的去对新生代进行回收(小回收),偶尔对老生代进行回收(大回收)
分代回收有个问题,就是当老年代的对象a引用了新生代的b对象时,当我们对新生代进行遍历收集时,因为只扫描新生代,所以判断b对象没有被使用,应该被回收,这是肯定不行的,所以我们引进了一个辅助空间,用来记载老生代对象对新生代的引用

jvm学习笔记,垃圾回收算法(一.基本垃圾回收算法介绍)_第3张图片

你可能感兴趣的:(java,后端)