Java虚拟机判定对象存活算法
1、引用计数算法
描述:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器值为0的对象就是不可能再被使用的。
特点:实现简单,判定效率高。
缺点:无法解决对象之间的相互循环引用的问题。
2、可达性分析算法
描述:通过一系列的成为“GC Roots”的对象作为引用起始点,从这些节点开始向下搜索,搜索所走过的路劲称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
可作为GC Roots的对象有:
- 虚拟机栈(栈帧中的本地变量表)中引用的对象;
- 方法区中静态属性引用的对象。
- 方法区中常量引用的对象。
- 本地方法栈中JIN(即一般说的Native方法)引用的对象。
3、引用
- 强引用(Strong Reference):指在程序代码中普遍存在了,类似“ Object obj = new Object() ”这类的引用,只要强引用还存在,垃圾收集器永远不会回收被引用的对象。
- 软引用(Soft Reference):指一些有用但是非必需的对象。对于软引用关联的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果二次垃圾回收还没有足够的内存,才会抛出内存溢出异常。
- 弱引用(Weak Reference):描述一下非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集之前。当垃圾收集器工作时,无论当前内存是否够用,都会回收掉掉被弱引用关联的对象。
- 虚引用(PhantomReference):最弱的一种引用关系,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的是能在这个对象被收集器回收时收到一个系统通知。
4、判定对象死亡
一个对象真正宣告死亡,至少需要经历两次标记过程:如果对象在进行可达性分析后发现没有与GC Roots相连的引用链,那么它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。(当对象没有覆盖finalize()方法,或者 finalize()方法已经被虚拟机调用过,这两种情况被虚拟机视为“没有必要执行”)
如果对象有必要执行finalize()方法,那么这个对象将会放置在一个叫做F-Queue的队列之中,并且稍后由一个由虚拟机自动建立的、低优先级的Finalizer线程去执行它(这里的执行是指去触发队列中对象的finalize()方法)。finalize()方法是对象逃逸死亡命运的最后一次机会,稍后GC将对F-Queue队列中的对象进行第二次小规模的标记,如果第二次标记还没有发现与GC Roots的引用链,那么它基本上会被回收。
在F-Queue队列中的对象如何重生:只要重新与引用链上的任何一个对象建立关联即可。比如把自己(this关键字)复制给某个类变量或者对象的成员变量。
5、方法区回收
Java虚拟机规范中没有要求虚拟机方法区实现垃圾收集,而且方法区进行垃圾收集的“性价比”一般比较低。
方法区的垃圾收集主要回收两部分:无用的常量和无用的类;
如果一个常量已经没有地方在使用这个常量,那么这个常量就可以被回收(常量池中的其他类/接口、方法、字段的符号引用都与此类似)。
一个可以被回收的类需要满足下面3个条件:
---- 该类所有的对象实例都已经被回收,也就是Java堆中不存在该类的任何实例。
---- 加载该类的ClassLoader已经被回收。
---- 该类对应的 java.lang.Class 对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
满足以上3个条件的类仅仅是“可以”被回收,并不是和对象一样,不使用了就必然回收。在虚拟机中可不可以被回收可以通过一系列参数控制。
在大量使用反射、动态代理、CGLib等ByteCode框架的、动态生成JSP以及OSGi这类频繁自定义ClassLoader的场景都需要虚拟机具备类的卸载功能,以保证永久代不会溢出。
Java虚拟机判定对象存活算法的更多相关文章
- 深入Java虚拟机--判断对象存活状态
程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...
- Java 垃圾回收机制方法,判断对象存活算法
垃圾回收机制: 不定时去堆内存中清理不可达对象.不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回 ...
- Java虚拟机详解04----GC算法和种类【重要】
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Java虚拟机详解04----GC算法和种类
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- java虚拟机之垃圾回收算法
标记-清除算法: 这是最基础的,就是之前所讲的两次标记,首先标记出所有 需要回收的对象,然后进行统一清除, 这有两缺点:一是效率低,标记和清除(开启低优先级进行回收)都是低效率的.第二是空间问题,标记 ...
- 深入理解Java虚拟机(三)、垃圾收集算法
1.第一门真正使用内存动态分配和垃圾收集技术的语言:Lisp 2.程序计数器.虚拟机栈.本地方法栈这3个区域随线程而生灭,这几个区域的内存会随着方法结束或线程结束而回收,GC关注的是Java堆和方法区 ...
- 深入理解java虚拟机【垃圾回收算法】
Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...
- JVM高级特性-三、垃圾收集之判断对象存活算法
一.概述 运行时数据区中,程序计数器.虚拟机栈.本地方法栈都是随线程而生随线程而灭的 因此,他们的内存分配和回收是确定的,在方法或线程结束时就回收.而Java堆和方 法区则是不确定的,程序运行过程中创 ...
- 4 Java 如何判定是否存活或者死亡
在堆中存放着几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事就是要确定这些对象之中哪些还活着,哪些对象已经死去. 判断对象是否已经死亡有以下几种算法: 引用计数法算法 定义 : 给对象中添加一 ...
随机推荐
- java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava
搭建spring cloud的时候,报以下错误: java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplica ...
- 死链接检查工具:Xenu 使用教程
一.软件作用 Xenu 全称Xenu’s Link Sleuth,是一款英文软件,界面单一,功能简单,使用方法很容易掌握.虽然看起来简单,但Xenu却拥有强大的功能.Xenu可以对网站的内链进行详细的 ...
- 干货,不小心执行了rm -f,除了跑路,如何恢复?
前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有bug,呵呵. 那么如果真的删除了不该删除的文件,比如数据库. ...
- 鸟哥的Linux私房菜笔记第四章
前言 对着<鸟哥的Linux私房菜-基础版>做了简化笔记.不想让自己知其然而不知其所然.所以写个博客让自己好好巩固一下,当然不可能把书中的内容全部写下来.在这里就简化一点把命令写下来. 让 ...
- 【Azkaban搭建】---Azkaban 3.25.0搭建细则 超实用
一.前述 Azkaban是一个工作流调度工具,因为需要各个任务之间有依赖关系,传统的Crontab 任务已经不能满足. 所以需要建立一套工作流引擎.相比Ooize来说,Azkaban的优势是作为一个客 ...
- C++线程安全日志库-Win32接口实现
分享一个C++日志库,使用Win32接口编写,而且是线程安全的日志库.比较简单,只有2个文件,容易上手,使用起来也很简单 头文件 如下是日志库的头文件,接口看似很多,但是使用起来最常用的也就那么几个 ...
- RabbitMq在CentOs7下的完整安装步骤,带你踩坑
1.前言 因为公司项目中用的RabbitMq来做消息处理,自己以前没有接触过,所以想自学一下.然额,光安装就花了6.7个小时才搞定,中间还换过一个版本,综合国内外博客才最终将所有安装中遇到的问题解决掉 ...
- 快速入门:弄懂Kafka的消息流转过程
大家都知道 Kafka 是一个非常牛逼的消息队列框架,阿里的 RocketMQ 也是在 Kafka 的基础上进行改进的.对于初学者来说,一开始面对这么一个庞然大物会不知道怎么入手.那么这篇文章就带你先 ...
- 19条MySQL优化准则
1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我们要重点关注的数据: type列,连接类型.一个好的SQL语句至少要 ...
- 第65章 博客帖子 - Identity Server 4 中文文档(v1.0.0)
第65章 博客帖子 65.1 团队帖子 65.1.1 2019 IdentityServer中的范围和声明设计 尝试使用IdentityServer4的设备流程 OAuth2中隐含流的状态 另一种保护 ...