深入了解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),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象. ...
随机推荐
- 解剖Nginx·自动脚本篇(5)编译器相关主脚本
在 Nginx 的自动脚本中,auto/cc目录下的所有脚本都是用于编译器相关配置使用的.Nginx的出色跨平台性(Linux.Darwin.Solaris.Win32 等)就有这些脚本的贡献.该目录 ...
- spring4-2-bean配置-2-属性注入细节
配置 bean,本章节中主要介绍蓝色文字部分. 配置形式:基于 XML 文件的方式:基于注解的方式 Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & 实例工厂方法).F ...
- JVM垃圾回收算法及回收器详解
引言 本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Pyth ...
- 洛谷 P3659 [USACO17FEB]Why Did the Cow Cross the Road I G
//神题目(题目一开始就理解错了)... 题目描述 Why did the cow cross the road? Well, one reason is that Farmer John's far ...
- Hash校验工具、MD5 SHA1 SHA256命令行工具
MyHash 检验工具http://www.zdfans.com/html/4346.html HashMyFiles Hash校验工具http://www.nirsoft.net/utils/has ...
- 两个线程并发执行以下代码,假设a是全局变量,那么以下输出______是不可能的?
3.两个线程并发执行以下代码,假设a是全局变量,那么以下输出______是不可能的? void foo(){ ++a; printf("%d ",a);}A.3 2 ...
- IIS相关知识和经验的碎片化记录
1.IIS(Internet Information Services)网站本机可以访问,局域网其他机器无法访问 导致这个问题之一是防火墙规则,解决办法如下: [开始]打开[控制面板],选择[WIND ...
- grpc-java 生成代码路径设置
grpc-java 生成代码路径设置 <plugin> <groupId>org.xolstice.maven.plugins</groupId> <arti ...
- 深入理解java虚拟机(十四)正确利用 JVM 的方法内联
在IntelliJ IDEA里面Ctrl+Alt+M用来拆分方法.选中一段代码,敲下这个组合,非常简单.Eclipse也用类似的快捷键,使用 Alt+Shift+M.我讨厌长的方法,提起这个下面这个方 ...
- 在 Linux 系统上快速获取命令的帮助信息
几种方法: help 命令 man 命令 info 命令 命令 --help man 章节分类如下 1 - commands 2 - system calls 3 - library calls 4 ...