JVM垃圾收集算法之标记算法
前言
总所周知,jvm的垃圾收集算法一般包括标记、清除、整理三个阶段,最近在看了有关于垃圾收集的标记算法,记录一下自己的理解。
垃圾收集中标记算法有两种:一种是引用计数法,一种是根搜索算法。
引用记数法
引用计数法非常容易理解,jvm为每一个对象设立一个引用计数器,当该对象被引用时,计数器就加一,引用取消时则减一。
当jvm开始gc时,jvm判断该对象的引用计数器是否为0,若为0则标记为可清除对象。


引用计数器有个致命的缺点是无法解决循环依赖问题,这也导致这个算法被弃用。
如下图所示,当对象A中有对B的引用,对象B中也有对A的引用,两者之间形成循环依赖。
除此之外,还有一个point引用了对象A,此时程序中还有point这个指针能够使程序到达这两个对象,
一旦point引用取消,我们就会丢失对这两个对象的控制,同时引用计数器未到达0,所以对象一直存在在堆中,JVM不能进行回收,从此造成内存泄漏。

根搜索算法
根搜索算法是目前大部分JVM所使用的标记算法。
根搜索算法会以根对象集合中的根对象出发,进行自上往下的搜索,与根对象直接连接或间接连接的对象都可以被搜索。
当JVM无法到达某个对象时,它会被标记为可清除对象。
根对象集合指的是:
- JAVA栈中的对象引用
- 本地方法栈的对象引用
- 运行时常量池中的对象引用
- 方法区中的类静态属性的对象引用
- 类对应的唯一数据类型的Class对象(这句话有点抽象,实际上每个类都有一个Class对象用于表示这个类在运行时被JVM加载的相关信息,如类名、方法、属性等)
可以使用ClassName.class、实例化对象.class、Class.forName(),获取该类的Class对象
根搜索算法的过程

JVM垃圾收集算法之标记算法的更多相关文章
- JVM GC-----3、垃圾标记算法(二)
在上一篇文章中,介绍了在GC机制中,GC是以什么标准判定对象可以被标记的,以及最有效最常用的可达性分析法.今天介绍另外一种非常常用的标记算法,它的应用面也相当广泛.这就是:引用计数法 Referenc ...
- JVM GC-----2、垃圾标记算法(一)
在上一篇文章中,我介绍了关于GC机制中,GC在确认垃圾对象后,是如何回收这些垃圾对象的几种算法.现在介绍下GC机制一般是如何定位(或者叫做标记)出这些垃圾对象的.我们先来问下自己,如何判介绍了断一个对 ...
- JVM垃圾收集算法(标记-清除、复制、标记-整理)
[JVM垃圾收集算法] 1)标记-清除算法: 标记阶段:先通过根节点,标记所有从根节点开始的对象,未被标记的为垃圾对象(错了吧?) 清除阶段:清除所有未被标记的对象 2)复制算法: 将原有的内存空间 ...
- JVM之GC算法、垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法
标记-清除算法 此垃圾收集算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记对象,它的标记过程前面已经说过——如何判断对象是否存活/死去 死去的对象就会 ...
- jvm系列(三):java GC算法 垃圾收集器
GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计 ...
- JVM垃圾收集算法
JVM垃圾收集 1. 判断对象是否存活 引用计数算法 对象添加一个引用计数器,每个地方引用它,计数器值加+1:当引用失效,计算器值减1:任何时刻计数器为0的对象不可能被使用.引用计数算法实现简单,高效 ...
- JVM笔记(三) 垃圾收集器(2)收集算法
垃圾收集器2:收集算法 主要通过阅读<深入了解Java虚拟机>(周志明 著)和网络资源汇集而成,为本人学习JVM的笔记.同时,本文理论基于JDK 1.7版本,暂不考虑 1.8和1.9 的新 ...
- JVM垃圾收集规则和算法
1.垃圾收集 Garbage Collection 程序计数器.虚拟机栈.本地方法栈这三部分内存随着线程生而生,随着线程灭而自然的回收,他们的大小在编译期间就大致确定了下来,所以对这部分的回收是具备确 ...
- JVM垃圾收集策略与算法
垃圾收集策略与算法 程序计数器.虚拟机栈.本地方法栈随线程而生,也随线程而灭:栈帧随着方法的开始而入栈,随着方法的结束而出栈.这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的 ...
随机推荐
- (转)MyBatis传入多个参数的问题
背景:记录mybaitis的使用方法,博闻强记,后面尽量记忆使用. MyBatis传入多个参数的问题 MyBatis传入多个参数的问题 详细记录mybatis在传递多个参数时候的使用方法 关于Myba ...
- mapreduce 变量共享
mapreduce 全局变量共享 在编写MapReduce程序时,经常会遇到这样的问题,全局变量如何保存?如何让每个处理都能获取保存的这些全局变量?使用全局变量是不可避免的,但是 在MapRdeuce ...
- Hbase操作集锦
一.Hbase架构与理解 Hbase架构大致如下,图片取自https://www.cnblogs.com/linkworld/p/10963910.html. 二.Hbase shell操作 创建Hb ...
- Android开发遇到的一些小问题
1.文件下载时,默认只能用https,怎么用http协议: 在Manifest.xml文件中增加一个配置项: android:usesCleartextTraffic="true" ...
- [转帖]IPC网络高清摄像机基础知识1(IPC芯片市场分析以及“搅局者”华为海思 “来自2013年”)
IPC网络高清摄像机基础知识1(IPC芯片市场分析以及“搅局者”华为海思 “来自2013年”) 2016-06-02 14:23:49 Times_poem 阅读数 9734更多 分类专栏: IPC网 ...
- Delphi BusinessSkinForm使用说明
1.先放bsBusinessSkinForm.bsSkinData.bsStoredSkin各一个到窗体上 2.修改bsBusinessSkinForm的SkinData属性为bsSkinData1 ...
- NOI2019网络同步赛游记
我发的邮件**f没收到,后来去专门询问才整到一个名额(估计是嫌我太菜,参加了也是垫底) day -1 上午写了到类似随机游走的高斯消元期望dp,然后颓颓颓 下午打洛咕月赛.T1一直50pts,后来才知 ...
- java异常的基本概念和处理流程
一.异常的基本概念 在java中把导致程序中断运行的情况分为两种,一种就是异常,而另外一种叫做错误.所有异常的基类是Exception,错误的基类是Error.Exception是在java程序中可以 ...
- gitblit搭建
gitblit 1.8.0 + java7 下载安装java7 https://download.oracle.com/otn/java/jdk/7u80-b15/jdk-7u80-windows- ...
- 使用httpClient 调用get,Post接口
1.httpClient 调用get接口 private async Task<IList<(int columnId, string columnName)>> GetFun ...