上篇文章我们了解到哪些内存区域和哪些对象可以被回收,这篇文章我们就来了解一下具体的垃圾回收算法的思路,不讨论具体的实现。

  一 最基础算法 标记-清除(Mark-Swap)

  为什么说他是最基础的算法,因为这之后的算法思路都是基于此来进行。如同他的名字一样,回收分为两个步骤,标记和清除,但是这种方式有两个缺陷,一是效率问题,标记和清除两个过程的效率都不高;二是空间问题,回收后可能产生大量的内存碎片,当需要给大对象分配内存空间的时候,有可能会导致提前触发一次垃圾回收:

  

  二 复制算法(Copying)

  为了结解决效率问题,一种名为复制的回收算法出现了,它会将新生代的内存分为两块相等的区域,一块成为Eden,另一块称之为Survivor,新生对象在Eden区域分配内存,经历一次垃圾回收之后,将存活的对象复制到Survivor区域,同时清空Eden区域,但是这样做会导致新生代50%的内存浪费,根据IBM的研究,大多数情况下,新生代的对象有98%是无法存活到下一次垃圾回收的,HotSpot虚拟机会将新生代按照8:1:1的比例分为一个Eden和两个Survivor区域(s1和s2),道理一样,新生对象在Eden分配内存区域,但是,为什么要分配两个survivor区域呢?答案是为了保证内存的连续性,按照虚拟机的规定,新生的对象经历过16次垃圾回收后仍旧存活的话,才会将其分配到老年代,一个survivor区域只能满足一次回收后的内存连续性,survivor总有一个为空的准备接受存活对象,具体过程如下:当触发垃圾回收时,Eden和s1中的存活对象会被复制到s2中,同时清空Eden和s1,下次再触发垃圾回收时,将Eden和s2中存活的对象分配到s1中,清空Eden和s2,s1和s2轮流保存存活对象,才能保证存活对象的内存连续性。

  三 标记-整理算法(Mark-Compact)

  当对象的存活效率较高时,复制的效率会很低,所以又引出了这种算法,思路是:标记的过程都一样,但后续不是对可回收对象进行清理,而是让所有存活对象向同一端移动,然后直接清理掉端边界以外的内存:

  

  以上就是几种主流算法的实现思路,但是很明显,某一种算法都不能完全满足所有内存区间的高效回收,所以,现代的商用虚拟机都是根据不同区域对象的生存周期特征采用分代收集来实现。在Java中,会将堆内存分为新生代和老年代,在新生代中,每次垃圾收集会有大量的对象死去,只有少量存活,复制成本低,就适合采用复制算法;在老年代中,对象存活率高,就必须使用标记-整理算法来进行回收。

  至此,我们了解了Java虚拟机内存回收算法的几种实现思路以及分别适应什么场景,下一篇文章我们将会了解这其中的具体实现中遇到的问题以及应该如何解决。

深入理解JVM(五) -- 垃圾回收算法的更多相关文章

  1. 深入理解JVM一垃圾回收算法

    我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. 一.stop the world 在介绍 ...

  2. JVM(九):垃圾回收算法

    JVM(九):垃圾回收算法 在本文中,我们将从概念模型的角度探讨 JVM 是如何回收对象,包括 JVM 是如何判断一个对象已经死亡,什么时候在哪里进行了垃圾回收,垃圾回收有几种核心算法,每个算法优劣是 ...

  3. jvm详情——3、JVM基本垃圾回收算法回收策略

    JVM基本垃圾回收算法回收策略 引用计数(Reference Counting):比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的 ...

  4. JVM G1垃圾回收算法简要介绍

    JVM G1垃圾回收算法简要介绍 G1的特点 能够像CMS垃圾回收算法一样并发操作应用线程(潜台词:多核) 无需太长时间即可压缩空闲内存空间(潜台词:不会引起太多的GC停顿时间) 尽可能地让GC时长可 ...

  5. jvm的垃圾回收算法

    一.对象存活判断判断对象是否存活一般有两种方式:1.引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,无法解决对象相互循环引用的问题.2 ...

  6. 深入探究JVM之垃圾回收算法实现细节

    @ 目录 前言 垃圾回收算法实现细节 根节点枚举 安全点 安全区域 记忆集和卡表 写屏障 并发的可达性分析 低延迟GC Shenandoah ZGC 总结 前言 本篇紧接上文,主要讲解垃圾回收算法的实 ...

  7. JVM常见垃圾回收算法

    jdk1.7.0_79 众所周知,Java是一门不用程序员手动管理内存的语言,全靠JVM自动管理内存,既然是自动管理,那必然有一个垃圾内存的回收机制或者回收算法.本文将介绍几种常见的垃圾回收(下文简称 ...

  8. jvm学习-垃圾回收算法(三)

     垃圾回收算法  引用计数法 比较古老的一种垃圾回收算法.在java的GC并没有采用 增加一个引用 引用+1 减少一个引用引用减一 每次清除引用为0的的对象 缺点:不能回收循环引用的垃圾对象 标记清除 ...

  9. 深入理解JVM——关于垃圾回收

    关于垃圾回收 仿佛来自上海居委会大妈的灵魂拷问:“你是什么垃圾?” 不 今天我们要说的是JVM的垃圾回收 假如我是一个“人”类的“对象”,也和人的生命一样必有一死,可是“我真的还想再活500年~~”, ...

随机推荐

  1. Cannot read property '_withTask' of undefined

    前言 Cannot read property '_withTask' of undefined 突然一下子,就报这个错了,刚刚还好好呢 Bug分析 1.是在template中调用了某个方法,但是你没 ...

  2. php 把数字转化为大写中文—升级版

    继上篇之后,发现某同事悄悄改了新版本,于是被我偷偷保存起来了,功能一样,不过他的比较短小,emmm.放了快一年了,悄悄放到博客里面. 功能需求在另一篇博客里 <?php function cny ...

  3. 解决:E: Could not get lock /var/lib/dpkg/lock

    问题: ubuntu16 执行 sudo apt install aria2 命令时,提示如下错误 E: Could not get lock /var/lib/dpkg/lock - open (1 ...

  4. 范仁义html+css课程---5、列表

    范仁义html+css课程---5.列表 一.总结 一句话总结: 学会基本的使用有序列表.无序列表.定义列表,设置样式的话尽量通过css而不是属性 1.无序列表基本形式(实例)? ul标签包裹li标签 ...

  5. Tomcat的并发能力

    关注   一.一些限制 Windows 每个进程中的线程数不允许超过 2000 Linux 每个进程中的线程数不允许超过 1000 在 Java 中每开启一个线程需要耗用 1MB 的 JVM 内存空间 ...

  6. QTP测试学习笔记

    QuickTest Professional(简称QTP)功能自动化测试,原属于Mercury Interactive公司产品,2006年7月被惠普公司收购了,通过安装文件目录可以看到,都是默认放在C ...

  7. Comparator中返回0导致数据丢失的大坑

    今天对一列数据进行排序,因为存储的是Map结构,要实现排序,马上就想到了TreeMap,于是查到API,这样新建TreeMap就能实现添加的时候就自动排序. new TreeMap<>(n ...

  8. win10磁盘分区

    注意:未分配的磁盘是无法使用的. 安装系统的时候,我们可以先将系统装起来,再来对未分配的磁盘进行操作. 具体步骤:https://jingyan.baidu.com/article/fcb5aff76 ...

  9. 新手Docker入门

    what's the Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植 ...

  10. Android原生同步登录状态到H5网页避免二次登录

    本文解决的问题是目前流行的 Android/IOS 原生应用内嵌 WebView 网页时,原生与H5页面登录状态的同步. 大多数混合开发应用的登录都是在原生页面中,这就牵扯到一个问题,如何把登录状态传 ...