深入了解java虚拟机(JVM) 第六章 垃圾回收算法
一、标记清除算法
标记清除算法顾名思义,就是将需要回收的对象进行标记,然后进行清除。那么这个算法就有标记和清除两种过程。标记过程主要是通过可达性分析算法进行判断存活对象,然后遍历所有的对象来找到需要回收的对象,开始进行清除过程。
这种算法虽然非常的简单,但是也有很多缺点:1.效率问题,上面我们已经将到了,这个算法在标记的时候需要遍历GC ROOT的根节点,而且在清除的时候是遍历了所有对象进行清除,这样回收的效率就会很低。
2.空间碎片过多,这个问题可以从上面就可以看出,回收的空间是不连续的,这样就会出现大量的空间碎片,如果大对象无法分配到足够的内存,就会提前触发GC(也可能会出现内存担保)。
二、复制算法
为了解决标记清除算法中的效率问题,就有了复制算法,我们通过图来了解这个算法:
1.将堆分为两个A、B空间(也可以是多个空间)

2. 所有的对象都创建在A空间

3.当进行垃圾回收的时候将A中标记的对象全部复制到B空间中,并且将对象排序

4.然后将A中的空间全部清除,接下来创建的对象,在B空间中创建

5.B空间进行垃圾回收时,则重复第一步开始进行回收
三、jvm中的标记清除算法
从上图可以看出这个算法也有一个很大的缺点,就是内存区域的极大浪费,所以在JVM中,对这种算法又进行了一次调优,这种调优方式不是适用于G1垃圾回收器JAVA9开始(默认的垃圾回收器为G1,有的java8默认的垃圾回收器也是G1),这就涉及到一个新的知识:新生代和老年代。
新生代:新创建的对象都会存放到新生代中(大对象除外)。他的特点是:很快就会被GC回收掉的或者不是特别大的对象。
老年代:在新生代每进行一次垃圾收集后,就会给存活的对象“加1岁”,当年龄达到一定数量的时候就会进入老年代(默认是15)。另外,比较大的对象也会进入老年代(这个会在后面的章节讲到),因此,老年代中存放的都是一些生命周期较长的对象或者特别大的对象。
jvm中使用标记清除算法,主要用于回收新生代。
1.将堆空间划分为一个Eden区域(占80%内存空间)和两个survivor(to和form区域,各站10%),此时空间中创建了一些对象

2.将Eden中存活的对象放入from区域。

3.一般来说,Eden区域中存活的对象不是很多,但是如果对象在survivor区域中依然存活,那么开始进行垃圾回收时,将from区域的存活对象放入to区域中,清空to区域和eden区域

4.接下来的回收就用to区域代替from区域,重复第一步进行开始。如果存活对象在进行一定次数的垃圾回收后,依然存活,那么这个对象就进入老年代
四、标记整理清除算法
这种算法主要用于老年代的垃圾回收,这个算法和标记清除类似,只是多了整理这一步骤,这个步骤主要是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
五、分代收集算法
这种算法将以上算法进行了整合,根据新生代内存回收率搞的内存区域先用标记清除和复制算法。对老年代回收率较低区域的采用标记清除整理算法。
深入了解java虚拟机(JVM) 第六章 垃圾回收算法的更多相关文章
- (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法
Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...
- Java虚拟机(二):垃圾回收算法
一.介绍 GC(Garbage Collection),垃圾收集 Java中,GC的对象是堆空间和永久区 二.GC算法 1. 引用计数法 老牌垃圾回收算法 通过引用计算来回收垃圾 Java中未使用,使 ...
- JVM学习总结二——垃圾回收算法
昨天总结了JVM内存分区相关的知识,这次我们将来了解下JVM的另一个核心知识点——垃圾回收算法.这一部分其实并不太难,如果对操作系统的内存处理算法有所了解,那么这部分算法其实只看名字就能明白,两者在原 ...
- JVM内存模型,垃圾回收算法
JVM内存模型总体架构图 程序计数器多线程时,当线程数超过CPU数量或CPU内核数量,线程之间就要根据时间片轮询抢夺CPU时间资源.因此每个线程有要有一个独立的程序计数器,记录下一条要运行的指令.线程 ...
- 轻松学JVM(四)——垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...
- 深入理解JVM(四)——垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...
- JVM内存模型及垃圾回收算法
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- JVM学习(三):垃圾回收算法
局部性原理和分代回收思想 大学学习操作系统或者计算机组成原理的时候都提到一个重要概念,叫局部性原理. 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小 ...
- 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结
垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段. 在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象. ...
随机推荐
- IOS 键盘的显示与关闭
在每一个IOS应用中,几乎不可避免的要进行文本输入操作,例如要求用户填写登陆注册信息,进行话题的评论回复,等等.用到的文本输入组件有UITextField,UITextView,对于这两个组件的相关属 ...
- doStartTag(),doEndTag()方法的执行
1 .TagSupport与BodyTagSupport的区别 TagSupport与BodyTagSupport的区别主要是标签处理类是否需要与标签体交互,如果需要交互的就用TagSupport,否 ...
- linux进阶与hadoop
Linux进阶命令: find . | ls --help | more grep ll | grep 1.txt grep -ri BASH 1.txt grep -ri BASH ...
- Vertex and fragment programs
[Vertex and fragment programs] When you use vertex and fragment programs (the so called "progra ...
- boxing & unboxing
[boxing & unboxing] Boxing is the process of converting a value type to the type object or to an ...
- 把http网站改为Https网站
腾讯云申请完证书后添加到服务器的方法: https://www.qcloud.com/document/product/400/4143#2.-nginx.E8.AF.81.E4.B9.A6.E9.8 ...
- cdoj1088-王之迷宫 (三维迷宫最短路径)【BFS】
http://acm.uestc.edu.cn/#/problem/show/1088 王之迷宫 Time Limit: 3000/1000MS (Java/Others) Memory Li ...
- 66. Plus One 数组加1
[抄题]: Given a non-negative integer represented as a non-empty array of digits, plus one to the integ ...
- ChainOfResponsibilityPattern(23种设计模式之一)
参考书籍:设计模式-可复用面向对象软件基础(黑皮书) 目的:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿这条链传递该请求,直到有一个对象处理它为止 ...
- code1154 能量项链
d[l][i]表示:从第i个珠子开始,连续l个珠子合并后释放的最大能量 状态转移方程d[l][i] = d[j][i] + d[l-j][i+j] + w[i]*w[i+j]*w[i+l],j从1到l ...