JVM垃圾回收(三)- GC算法:基础
GC算法:基础
在介绍GC算法在实际场景中的实现之前,我们先定义一些必要的术语,以及GC算法的基本准则。具体的细节会因收集器的不同而稍有区别,但是基本上来说,所有的收集器会关注以下两个方面:
- 找出所有仍然存活的对象
- 清除掉其他所有非存活对象(被认为是dead,并且不会再被使用的对象)
在所有的收集器内部,第一步实现的均是:遍历出所有存活的对象。由标记(Marking)进程完成。
标记所有可达对象
在JVM中,任何主流GC算法均会以找出所有存活对象为开始。这个概念的解释可以参考下图:

首先,GC定义某些特定的对象为Garbage Collection Roots,一些典型的GC roots如:
- 当前执行的方法中的本地变量以及输入参数
- 当前活跃的线程
- 已载入的类中的静态区域
- JNI(Java Native Interface)引用
下一步,GC遍历内存里的整个对象图(whole object graph),从GC roots开始,遍历它们引用的所有对象。任何被GC访问到的对象会被标注为存活。
在上图中,蓝色的圆圈表示存活的对象。当Marking阶段完成时,所有存活的对象会被标注。所有其他对象(上图中的灰色圆圈)便是无法由GC roots访问到的对象,也就是说,你的应用无法再使用这些不可达的对象。这种对象被认为是垃圾,GC在清除它们时会经历以下阶段:
- 应用中的线程需要被停止,以便让Marking阶段正常运行。因为应用若是持续运行,则JVM里的对象可能随时在变化,这样就不足以获取到精确的信息。这个场景被称为一个安全点(safe point),它造成的结果便是一个Stop The World pause。Safe point可被不同的原因触发,但是到现目前为止,GC是引入safe point最常见的原因
- 这个暂停持续的时间并不取决于堆内存里对象的总数量,也不取决于堆内存的大小。它是由存活的对象个数决定的。所以,增加堆内存的大小并不会直接影响marking阶段的持续时间
Removing Unused Objects
不同的GC算法中,清楚unused objects的方式稍有不同。但是所有这类GC算法基本上可以分为以下三组:
- Sweeping
- Compacting
- Copying
Sweeping
Mark and Sweep 算法对于垃圾使用了最简单的方式:忽略掉这些对象。具体的说,就是在marking阶段完成后,所有没被访问到的对象所占据的空间,均被视为可用的空间。并可以被用于为新的对象分配。
这种方式使用到一种名为free-list的结构来记录每个空闲的区域(region)以及它的大小。free-list的管理方法会增加对象分配(object allocation)的开销。并且,它会有一个缺点:可能会存在大量的空闲region,但是如果单个region的空间不足以满足一个allocation,则这个allocation也会失败,并返回OutOfMemoryError的报错。

Compact
Mark-Sweep-Compact算法解决了Mark and Sweep的缺点。它将所有被标注为存活的对象移动到内存区域的起始。这种方法的缺点是增加了每次GC暂停的时间,因为我们需要将所有的对象移动到一个新的地方,并且更新它们的引用。它的优点也显而易见:在这个compacting操作完成后,对于新对象的分配会非常容易。使用这种方式,空余空间的地址随时可获取,并且也不会有碎片的问题。

Copy
Mark and Copy算法与Mark and Compact非常接近,因为它们都会重新allocate所有存活的对象。比较重要的不同点是:Mark and Copy 重分配的目标空间在一个不同的内存区域。它的优点是可以与Marking阶段并行执行。缺点是它需要一个足够大的额外内存区域,以支持所有的存活对象。

References:
https://plumbr.io/handbook/garbage-collection-algorithms
JVM垃圾回收(三)- GC算法:基础的更多相关文章
- JVM垃圾回收(GC)
JVM垃圾回收(GC) 1. 判断对象是否可以被回收 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,但无法解决对象相互循环引用的问 ...
- JVM 垃圾回收(GC)机制
目录 一.背景 二. 哪些内存需要回收? 1.引用计数算法 2 .可达性分析算法 三. 四种引用状态 1.强引用 2.软引用 3.弱引用 4.虚引用 对象死亡(被回收)前的最后一次挣扎 方法区如何判断 ...
- JVM垃圾回收机制GC
1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 ...
- Java:JVM垃圾回收(GC)机制
JVM垃圾回收算法 1.标记清除(Mark-Sweep) 原理: 从根集合节点进行扫描,标记出所有的存活对象,最后扫描整个内存空间并清除没有标记的对象(即死亡对象)适用场合: 存活对象较多的情况下比较 ...
- JVM垃圾回收(GC)原理
一.基本垃圾回收算法 1.引用计数(Reference Counting) 比较古老的回收算法.原理是此对象有一个引用则增加一个引用计数,删除一个引用则较少一个引用计数.垃圾回收时,只回收引用计数为0 ...
- jvm 垃圾回收机制和算法(转)
stop-the-world 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC ...
- JVM——垃圾回收(GC)
GC简单介绍 java语言执行在java虚拟机(jvm)上.为了解决有限的空间和性能的保证这个矛盾体,jvm所具备的GC能力.能够有效的清除不用的对象.使空间的利用更加合理.以下介绍该机制的原理. 推 ...
- JVM垃圾回收(GC)整理总结学习
基本回收算法 1. 引用计数(Reference Counting)比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的对象.此算法最 ...
- jvm 垃圾回收概念和算法
1.概念 GC 中的垃圾,特指存在于内存中.不会再被使用的对象.垃圾回收有很多种算法,如引用计数法.复制算法.分代.分区的思想. 2.算法 1.引用计数法:对象被其他所引用时计数器加 1,而当引用失效 ...
- JVM 垃圾回收 Minor gc vs Major gc vs Full gc
关于垃圾回收机制及比较请参见:http://colobu.com/2015/04/07/minor-gc-vs-major-gc-vs-full-gc/ http://colobu.com/2014/ ...
随机推荐
- css遮罩蒙版效果 分栏效果
mask遮罩蒙版效果 来看一下效果图: 这是两张原图: 遮罩层图像 注意,白色区域为透明状态 要展示的图像 使用mask之后产生的效果图 首先来解释一下遮罩.蒙版.和PS中的蒙版.Flash中 ...
- 虚拟机——虚拟机VMware Workstation 的.vmdk格式与VirtualBox 的.vdi格式相互转换
啦啦啦~~~ 由于现在Vmware Workstation的越来越普及,让很多小伙伴不知道怎么把以前用的VirtualBox虚拟机vdi格式转换成vmdk格式,下面我们就来转换一下吧... 第一步:找 ...
- 接口自动化测试持续集成--Soapui接口测试
接口测试目前笔者掌握的工具有三种: 一.python+requests+jenkins,优点:代码实现接口测试,对测试代码书写比较自由等:缺点:需要测试者需要有一定的代码基础: 二.jmeter+an ...
- 一般程序中的session
在WebHandler中无法访问session: IRequiresSessionState必须实现这个接口(不包含任何方法的标记接口), 需要导入using System.Web.SessionSt ...
- Unity3D判断当前所在平台
Unity3D是一个跨平台的开发工具,支持的平台五花八门,常常开发一款游戏要发布到不同的平台,在不同的平台上会使用不同的代码,难道要我们各平台分别使用一套代码,单独编译一次吗?当然不用了,呵呵. ...
- nmon安装与使用
一.检查安装环境 1,# uname –a (查看操作系统信息,所检查服务器为64位操作系统) Linux jmeter 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 ...
- Ping 命令实战小结--TCP/IP协议学习
2011-12-22 22:38:49 图1 图2 一,环境说明 硬件连线.PC与2440开发板直接用网线连接. PC的ip地址:192.168.0.107.2440开发板的ip地址:192.168. ...
- Appium(一)---环境搭建的一些问题
最近开始学习Appium,一款很不错的自动化测试工具,网上已经有大量的环境搭建教程,我就不再细说,我搭建环境时主要参考如下两个博客https://www.cnblogs.com/yoyoketang/ ...
- js 对url进行某个参数的删除,并返回url
两种情况 1对当前页面的url进行操作 function funcUrlDel(name){ var loca = window.location; var baseUrl = loca.origin ...
- nodejs笔记之连接mysql数据库
1.安装mysql模块: npm install mysql 2.引入mysql模块 创建一个server.js文件 const http = require("http"); c ...