判断哪些内存需要回收

引用计数算法、可达性分析算法。引用计数算法优点实现简单,但是无法判断循环引用。

可达性分析算法:通过一系列的GC ROOTS作为起点,往下搜索,所走过的路径叫引用链。当一个对象没有引用链到GC ROOTS上,则可以回收。

finalize 自救

finalize被执行,对象不一定被回收

一个对象宣布死亡,需要两次标记

第一次:没有与GC ROOTS相连接。finalize方法被覆盖并且没有调用过,则进入F-Queue队列。这个是在优先级低的finalizer线程执行,不保证等待线程结束。如果其中一个运行太久,其他对象的finalize会一直等待。

finalize是完成自救的最后机会。可以把this复制给GC ROOTS,避免第二次标记时被回收。不一定能救,因为优先级低

第二次:判断第一次标记的对象中,是否还是没有与GC ROOTS连接。如归是则回收,并且不会执行finalize(要么已经在第一次标记时执行,要么没有覆写)

不过finalize方法已经是Deprecated,由于可能导致性能,死锁和挂起等问题将会被移除。

例子

public class FinalizeEscapeGC {

public static FinalizeEscapeGC SAVE_HOOK = null;

public static void main(String[] args) throws Exception {

SAVE_HOOK = new FinalizeEscapeGC();

SAVE_HOOK = null;

// 这两句保证进行垃圾回收标记, finalize能进行挽救自己

System.gc();

Thread.sleep(500);

if (SAVE_HOOK == null) {

System.out.println("i am dead");

} else {

// 这里被执行,成功挽救自己

System.out.println("i am still alive");

}

// 一样的的代码

SAVE_HOOK = null;

System.gc();

Thread.sleep(500);

if (SAVE_HOOK == null) {

// 这里被执行, 无法挽救,finalize只能执行一次

System.out.println("i am dead");

} else {

System.out.println("i am still alive");

}

}

@Override

protected void finalize() throws Throwable {

super.finalize();

SAVE_HOOK = this;

System.out.println("finalize execute");

}

}

输出:

finalize execute

i am still alive

i am dead

java 可达性分析算法_垃圾回收:可达性分析算法、生存还是死亡(两次标记)相关推荐

  1. a*算法的优缺点_垃圾回收的常见算法

    垃圾回收的常见算法 2.1 引用计数法 2.1.1 原理 2.1.2 优缺点 2.2 标记清除法 2.2.1 原理 2.2.2 优缺点 2.3 标记压缩算法 2.3.1 原理 2.3.2 优缺点 2. ...

  2. 判别两棵树是否相等 设计算法_垃圾回收算法和垃圾收集器

    1.什么是垃圾回收 对于内存当中无用的对象进行回收,如何去判断一个对象是不是无用的对象. 引用计数法: 每个对象中都会存储一个引用计数,每增加一个引用就+1,消失一个引用就-1.当引用计数器为0时就会 ...

  3. java简述垃圾回收原理及算法_Java垃圾回收原理和算法

    ·内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放. 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可.垃圾回收器将负责回收所有 ...

  4. 垃圾回收算法_垃圾回收算法有哪些

    垃圾检测通常通过建立一个根对象的集合以及建立一个从这些根对象开始能够触及的对象集合来实现.如果正在执行的程序可以访问到根对象和某个对象之间存在引用路径,这个对象就是可触及的.对于程序来说,根对象总是可 ...

  5. 6种java垃圾回收算法_Java垃圾回收算法

    主要根据以下3篇博客做的整理 http://blog.csdn.net/zsuguangh/article/details/6429592 http://www.cnblogs.com/ywl925/ ...

  6. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

  7. java垃圾回收机制标记_Java的垃圾回收机制-垃圾收集算法(一)

    当需要排查各种内存溢出,内存泄漏等问题时,当垃圾收集成为系统达到更高并发的瓶颈时,我们有必要深入GC的原理. image.png 常见垃圾回收算法 在查看垃圾回收具体过程的时候,运行程序加上: -XX ...

  8. java知识点8——垃圾回收原理和算法、通用的分代垃圾回收机制、 JVM调优和Full GC、开发中容易造成内存泄露的操作

    垃圾回收原理和算法 内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放. 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可 垃圾回 ...

  9. 从CMS垃圾回收器分析常用的垃圾回收算法

    目录 标记(Mark) 清除(Sweep) 如何解决碎片化问题 复制(Copy)算法 整理(Compact)算法 总结几种回收算法的特点 CMS分代回收的实现 CMS中年轻代使用复制算法 老年代使用标 ...

  10. 垃圾回收①---概述+相关算法

    本篇目录 1.概述 1.1 什么是垃圾 1.2 为什么需要GC 1.3 早期垃圾回收 1.4 Java垃圾回收机制 2.垃圾回收相关算法 2.1 垃圾标记阶段:对象存活判断 2.2 标记阶段算法1_引 ...

最新文章

  1. 第一次来写博客,这里可以记录很多故事。
  2. JetsonXavier/Tx2性能测试比对
  3. ubantu18.04使用docker部署mysql5.7及在宿主机登录容器内mysql
  4. 在C#中利用SharpZipLib进行文件的压缩和解压缩
  5. 【数据库系统】O/R映射
  6. ECMAScript6(17):Class类
  7. (秒杀项目) 4.6 分布式状态管理
  8. RHEL7修改命令行界面的分辨率
  9. 《当代教育心理学》(第2版)学习笔记
  10. 生命在于学习——代码审计工具
  11. Smart Git Assume Unchanged
  12. 基于React全家桶开发「网易云音乐PC」项目实战(三)
  13. C#可以直接调用的Win32API
  14. 内核与驱动文件的version magic匹配问题
  15. 乔布斯与Google鲜为人知的故事
  16. 插鼠标出现 usb设备无法识别 解决办法
  17. Altium Designer 如何从已有的PCB图、原理图,分别导出PCB封装库和原理图封装库
  18. 有能力的人从不抱怨大环境!
  19. 湿度传感器行业调研报告 - 市场现状分析与发展前景预测
  20. 开源开放 | 中药说明书实体识别数据集TCM-NER

热门文章

  1. c语言全局变量global,C语言定义共享全局变量
  2. 【Linux实验】LINUX系统的文件操作命令
  3. JDK8 toMap之key重复报Duplicate key xxxx异常解决
  4. 人脸检测高级:疲劳检测
  5. ms17010漏洞利用(主机漏洞利用)
  6. matlab 密集,matlab – 全局和parfor
  7. S3存储服务间数据同步工具Rclone介绍
  8. 智慧路灯控制系统解决方案
  9. MariaDB安装报1067错误解决方式
  10. c51单片机小车代码解释