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/ ...
随机推荐
- git反悔
Checkout checkout命令用于从历史提交(或者暂存区域)中拷贝文件到工作目录,也可用于切换分支.  ![ ...
- datetimepicker 使用
首先引入 <%--日历样式--%> <link rel="stylesheet" type="text/css" href="< ...
- (转载)WinRAR离购买许可只剩x天
在WinRAR的安装目录下,新建文件RarReg.key(C:\Program Files\WinRAR\RarReg.key) 粘贴以下内容即可: RAR registration dataFede ...
- mongols的反向代理和负载均衡功能
mongols是C++ 服务器基础设施库,它最近更新提供了反向代理和负载均衡功能. 以下为用mongols代理两个nodejs后端(8888和8889)并与nginx压测对比图: 压测显示mongol ...
- cocos dos命令
- JS根据屏幕分辨率改变背景宽高
//控制浏览器显示的高宽 function document_loaded() { GotoMainStep(); /; document.getElementById("main1&quo ...
- Java EE开发技术课程第五周(Applet程序组件与AJAX技术)
1.Applet程序组件 1.1.定义: Applet是采用Java编程语言编写的小应用程序,该程序可以包含在HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同.含有Apple ...
- 服务器被疑似挖矿程序植入,发现以及解决过程(建议所有使用sonatype/nexus3的用户清查一下)
此次服务器被植入挖矿程序发现起来较为巧合,首先是上周三开始,我通过sonatype/nexus3搭建的仓库间歇性崩溃,但是每次重新start一下也能直接使用所以没有彻底清查,去docker logs里 ...
- 数据分片一致性hash
一致性hash 一致性hash是将数据按照特征值映射到一个首尾相接的hash环上,同时也将节点(按照IP地址或者机器名hash)映射到这个环上.对于数据,从数据在环上的位置开始,顺时针找到的第一个节点 ...
- Linux中检查本地系统上的开放端口列表的方法
在 Linux 中很少有用于此目的的实用程序.然而,我提供了四个最重要的 Linux 命令来检查这一点. 你可以使用以下四个命令来完成这个工作.这些命令是非常出名的并被 Linux 管理员广泛使用.n ...