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

  一 最基础算法 标记-清除(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. 手把手实例对比String、StringBuilder字符串的连接效率及StringBuilder和StringBuffer线程安全的比较

    一.字符串连接的效率问题 使用String连接字符串时为什么慢? 小知识点 java中对数组进行初始化后,该数组所占的内存空间.数组长度都是不可变的. 创建一个字符串,为字符串对象分配内存空间,会耗费 ...

  2. 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

    今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...

  3. Redis代码示例

    RedisTemplate 如果想要在java中使用Redis相关的数据结构,要先注入RedisTemplate. @Autowired private RedisTemplate<K,V> ...

  4. (转载)OpenStack client 调用分析

    https://blog.csdn.net/yenai2008/article/details/72722038?utm_source=itdadao&utm_medium=referral# ...

  5. 刷题记录:2018HCTF&admin

    目录 刷题记录:2018HCTF&admin 一.前言 二.正文 1.解题过程 2.解题方法 刷题记录:2018HCTF&admin 一.前言 经过一个暑假的学习,算是正经一条web狗 ...

  6. 删除N天前的log日志文件:RollingFileAppender,DailyRollingFileAppender,/etc/cron

    1. 如果您使用的是Log4j,且采用的RollingFileAppender方式, 通过设置maxBackupIndex属性来指定要保留的日志文件数的最大值可以间接实现删除N天前的日志文件. 2. ...

  7. flask 实现最简单的登录功能

    视图函数如下: # Sample.py from flask import Flask, render_template, url_for, request, redirect app = Flask ...

  8. android -------- AES加密解密算法

    AES加密标准又称为高级加密标准Rijndael加密法,是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准.AES的基本要求是,采用对称分组密码体制,密钥长度可以为128.192或25 ...

  9. Java基础 三目运算符 用if-else对其进行解释

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  10. nginx自定义错误页面

    这里配置注意是在 server 443端口 ,蓝色部分为主要部分.这个server不是全部代码. server{ #监听443端口 listen ; #对应的域名,把baofeidyz.com改成你们 ...