深入理解JVM(五) -- 垃圾回收算法
上篇文章我们了解到哪些内存区域和哪些对象可以被回收,这篇文章我们就来了解一下具体的垃圾回收算法的思路,不讨论具体的实现。
一 最基础算法 标记-清除(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(五) -- 垃圾回收算法的更多相关文章
- 深入理解JVM一垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. 一.stop the world 在介绍 ...
- JVM(九):垃圾回收算法
JVM(九):垃圾回收算法 在本文中,我们将从概念模型的角度探讨 JVM 是如何回收对象,包括 JVM 是如何判断一个对象已经死亡,什么时候在哪里进行了垃圾回收,垃圾回收有几种核心算法,每个算法优劣是 ...
- jvm详情——3、JVM基本垃圾回收算法回收策略
JVM基本垃圾回收算法回收策略 引用计数(Reference Counting):比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的 ...
- JVM G1垃圾回收算法简要介绍
JVM G1垃圾回收算法简要介绍 G1的特点 能够像CMS垃圾回收算法一样并发操作应用线程(潜台词:多核) 无需太长时间即可压缩空闲内存空间(潜台词:不会引起太多的GC停顿时间) 尽可能地让GC时长可 ...
- jvm的垃圾回收算法
一.对象存活判断判断对象是否存活一般有两种方式:1.引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,无法解决对象相互循环引用的问题.2 ...
- 深入探究JVM之垃圾回收算法实现细节
@ 目录 前言 垃圾回收算法实现细节 根节点枚举 安全点 安全区域 记忆集和卡表 写屏障 并发的可达性分析 低延迟GC Shenandoah ZGC 总结 前言 本篇紧接上文,主要讲解垃圾回收算法的实 ...
- JVM常见垃圾回收算法
jdk1.7.0_79 众所周知,Java是一门不用程序员手动管理内存的语言,全靠JVM自动管理内存,既然是自动管理,那必然有一个垃圾内存的回收机制或者回收算法.本文将介绍几种常见的垃圾回收(下文简称 ...
- jvm学习-垃圾回收算法(三)
垃圾回收算法 引用计数法 比较古老的一种垃圾回收算法.在java的GC并没有采用 增加一个引用 引用+1 减少一个引用引用减一 每次清除引用为0的的对象 缺点:不能回收循环引用的垃圾对象 标记清除 ...
- 深入理解JVM——关于垃圾回收
关于垃圾回收 仿佛来自上海居委会大妈的灵魂拷问:“你是什么垃圾?” 不 今天我们要说的是JVM的垃圾回收 假如我是一个“人”类的“对象”,也和人的生命一样必有一死,可是“我真的还想再活500年~~”, ...
随机推荐
- rust猜数游戏代码
use std::io; use rand::Rng; use std::cmp::Ordering; fn main() { println!("Guess the number!&quo ...
- 【自学Spring Boot】什么是Spring Boot
为啥要有Spring Boot? 以前大学刚开始学java web的时候,需要搭建起web框架,当时使用的是SSH(struts+spring+hibernate),那就开始搭建吧,初学者哪里知道整套 ...
- Thinking In SE
各种编程范式的区别 并发模型 并行架构: 位级(bit-level)并行 指令级(instruction-level)并行 数据级(data)并行 数据级并行 任务级(task-level)并行 -- ...
- Java的死锁及解决思路(延伸: 活锁,饥饿,无锁)
死锁: A线程持有 锁1,接下来要获取锁2:与此同时,B线程持有锁2,要获取锁1.两个线程都在等对方释放自己需要的锁,这时两方会永远等待下去,就形成了死锁. 死锁的四个必要条件: 1.互斥:资源(锁) ...
- git 清除所有untracked file
上次合并分支的时候,出现了一些没见过的文件,有.orig等等.如下图: 接下来,就是git的神奇操作命令: git clean -f 将所有untracked file 一次性删除
- 爬虫urllib2库的基本使用
所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 在Python中有很多库可以用来抓取网页,urllib2库基本使用. urllib2 是 Python2.7 自带的模块 ...
- EasyNVR网页无插件播放摄像机RTSP流是如何调取接口在Web页实现多窗口同时直播的
背景需求 在互联网飞速发展的时代,开发者常会说的一个词就是"跨平台".自从移动端的用户需求越来越大,H5逐渐发展,跨平台似乎已经成为了软件开发不可或缺的技术.EasyNVR互联网直 ...
- jwplayer :若请求不到流,则页面一直转圈请求效果
思路: 利用jwplayer onPlay(播放) .onError(出错)事件. 页面:背景图为黑色,嵌入一张背景为黑色的 git 动态图,加载页面时隐藏. 流程:若进入到onPlay 方法,则说明 ...
- GitLab - GitLab的备份与还原
1 - GitLab配置文件 GitLab默认的配置文件路径:/etc/gitlab/ /etc/gitlab/gitlab.rb:主配置文件,包含外部URL.仓库目录.备份目录等 /etc/gitl ...
- robot:当用例失败时执行关键字(发送短信)
使用场景: 当用例失败时需要通知对应人员,则需要在Teardown中,使用关键字Run Keyword If Test Failed Send Message关键字为自定义关键字,${content} ...