一、什么是垃圾?

程序在运行过程中,长时间会有一些无引用且仍然存活动对象,就好多比,你有一套很大的房子,有好几个房间,自己又是个吃货,专门搞了一个房间用于存放零食。吃货每次去超市都会买一些东西回来放在零食房间,时间长了后吃货发现,已经有好多都过期了,怎么办呢?想啥呢,直接扔了吧,对于保质期内的零食来说,这些过期的就是垃级,要进行清除,把空间释放出来给下一波在路上的零食。

二、怎么找到这些垃圾?

都是从根开始进行搜寻(gcRoots)

1、引用计数法(未采用此算法)

每当对象被别的地方引用了一次,该对象计数器为+1,取消该对象的引用,该对象计数器 -1,任可时刻,如果该对象的计数器为0,该对象将被回收, 比如:

public static void method() {// 1、创建一个对像放在 heap 中// 2、将对象复制给局变量 userUser user = new User();
}
public static void main(String[] args) {method();
}

弊端
无法处理循环引用的问题;
堆内对象的每一次引用赋值和每一次引用清除,都伴随着加减操作,会带来一定的性能开销。

class A {B b;public void setB(B b) {this.b = b;}
}class B {A a;public void setA(A a) {this.a = a;}
}public void method() {A a = new A();B b = new B();a.setB(b);b.setA(a);
}


method 方法中,执行完两个set后,method方法结束,图中两条红线引用消失,留下两个对象在堆中循环引用,但此时只有他们自己在相互引用,造成内存泄漏。()

2、标记清除算法
标记前:

创建对象过程都是要求待分配的空间是连续的,比如剩下只有两个 1M 但不连续的空间,但要创建2M的对象时,是不能成功的,因为空间不连续,所以造成内存碎片
3、复制算法
看到标记清除算法中会产生内存碎片导致内存泄露,进而产生复制算法进行补充,每次需要分配内存时,先按内存容量将内存划分为等大小的两块空间,该段时间只允许在其中一块内存上进行分配,比如A块,当A块内存被分配完后,则把A块内存上尚存活地复制到B块内存上,然后直接清理A块内存

该算法虽然解决了内存碎片的问题,但又带来了一个问题,可用内容被压缩只有原来的一半,且当存活对象很多的话,复制算法的效率会大大降低
3、标记整理(压缩)
为了解决标记清除产生的内存碎片,复制算法中的缺陷,又提出来了标记整理算法,先标记出来不清理,而是将这些存活的对象移到内存的一端,然后从端边界开始清除,也就是中间多了一个整理的步骤

标记整理算虽然解决了标记清除和复制算法所带的缺陷,但是从图中可以看出来,标记整理算法导致内存变动的更加频繁,因为需要不断的整理存活对象的引用地址, 所以效率上比复制算法要差很多。
4、分代回收
分代回收严格来说不算是一种算法,是结全以上三种后的一种算法思想,针对不同情况所采用不同算法的一套组合拳,当然分代回收也是目前 大部分JVM默认采用的算法,其核收思想是根据对象存活的不同生命周期将内存划分不同的域(年轻代和老年代)

4.1 新生代的特点是每次垃圾回收时都有大量垃圾需要被回收
4.2 老年代的特点是每次垃圾回收时只有少量对象需要被回收
4.3 所以分代回收算法可以根据不同区域选择不同的算法

参考资料:
Java GC回收算法-引用计数法

GC垃圾回收之标记清除、复制、标记整理和分代回收算法详解

垃圾回收及涉及的算法相关推荐

  1. JVM虚拟机(四):JVM 垃圾回收机制概念及其算法

    垃圾回收概念和其算法 谈到垃圾回收(Garbage Collection)GC,需要先澄清什么是垃圾,类比日常生活中的垃圾,我们会把他们丢入垃圾箱,然后倒掉.GC中的垃圾,特指存于内存中.不会再被使用 ...

  2. 内存管理篇(三):Go垃圾回收之三色标记算法

    三色标记法介绍: 三色标记法(tricolor mark-and-sweep algorithm)是传统 Mark-Sweep 的一个改进,它是一个并发的 GC 算法,在Golang中被用作垃圾回收的 ...

  3. jvm垃圾回收机制和常见算法

    这是朋友给的面试题里边的,具体地址已经找不到,只能对原作者说声抱歉了: 理论上来讲sun公司只定义了垃圾回收机制规则,而步局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同. GC(Gar ...

  4. JVM 垃圾回收机制和常见算法

    理论上来讲 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同. GC(Garbage Collector)在回收对象前首先必须发现那些无用的对象, ...

  5. 第七篇章——垃圾回收概念及相关算法

    垃圾回收--概述 本专栏学习内容来自尚硅谷宋红康老师的视频以及<深入理解JVM虚拟机>第三版 有兴趣的小伙伴可以点击视频地址观看,也可以点击下载电子书 垃圾回收概述 垃圾回收不是Java语 ...

  6. 【JVM进阶之路】垃圾回收机制和GC算法之三色标记(三)

    JVM往期文章 [JVM进阶之路]内存结构(一) [JVM进阶之路]玩转JVM中的对象(二) 上篇文章中讲到JVM中的对象以及判断对象的存活,那么对于"已死"的对象应该如何处理,怎 ...

  7. JVM—7—垃圾回收概述及相关算法

    文章目录 一.垃圾回收概述 1.概念 2.什么是垃圾 2.1 什么是垃圾? 2.2 磁盘碎片整理 2.3 大厂面试题 3.为什么需要GC 4.早期垃圾回收 5.Java垃圾回收机制 5.1 优点 5. ...

  8. 【Java 虚拟机原理】垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )

    文章目录 一.Java 虚拟机内存分区 二.垃圾回收机制 三.引用计数器算法 ( 无法解决循环引用问题 ) 一.Java 虚拟机内存分区 Java 虚拟机内存分区 : 所有线程共有的内存区域 : 堆 ...

  9. 垃圾回收机制之复制算法

    我再说一下什么是磁盘碎片化,磁盘碎片化表示删不干净,比如我格式化磁盘,肯定效率高一点,而且删的干净一点,如果一个一个的删除的话,容易产生碎片,有一部分没有被删除掉,你们可以下去自己做一个例子,有的时候 ...

最新文章

  1. 网站自己生成专题php,phpcms生成专题的同时自动生成专题相关文章
  2. chromedp网络监听_动态爬虫三:监听网络事件 + 监听js事件
  3. nod32可以限制软件安装么_玻璃钢法兰安装时可以别劲么 玻璃钢法兰安装视频
  4. facebook 图像比赛_使用Facebook的Detectron进行图像标签
  5. 判断一个男人穷还是富,只看这几点!
  6. 论文浅尝 | 对于知识图谱嵌入表示的几何形状理解
  7. 社交网络营销之制订“参与社交网络的规则”
  8. poj3278 CatchThatCow bfs
  9. 《神经网络和深度学习》系列文章五:用简单的网络结构解决手写数字识别
  10. 数据结构严蔚敏(c语言版)课后算法题答案-树和二叉树
  11. mysql 敏感词_过滤敏感词方式
  12. java vm 参数及设置(转载)
  13. 最新CISP模拟考试题库及答案(一)
  14. C-COT -- 超越相关滤波:学习连续卷积算子(Continuous Convolution Operators)
  15. 使用kind安装单机版k8s学习环境
  16. java八皇后答案_java八皇后问题详解
  17. 重庆html5全景,用pano2vr 转swf 全景图
  18. 机器人操作系统入门(一)ROS简介
  19. Web版2048游戏制作
  20. 利用平台系统运营店铺五大法则

热门文章

  1. 7-13 菲姐游泳 - 实验3 游泳奥运冠军菲姐刻苦训练,从早上a时b分开始下水训练,直到当天的c时d分结束。请编程计算:菲姐当天一共训练多少小时多少分钟?
  2. 基于java springboot android 安卓校园宿舍报修系统源码(毕设)
  3. 十年踪迹:巧用 currentColor 属性来实现自定义 checkbox 样式
  4. nomasp 博客导读:Android、UWP、Algorithm、Lisp(找工作中……
  5. 基于Vue.js 的天天影视云视听平台的设计
  6. js正则匹配首尾不能为空格,中间可以为空格的字符串
  7. 永磁同步电机(PMSM)的FOC闭环控制详解以及SVPWM的原理及法则推导和控制算法
  8. Geospatial Data Science (1):Introduction and Geometric objects
  9. Spring Batch之读数据—读JSON文件(二十八)
  10. Spring Batch之读数据—读带有头文件的文件(三十一)