Java垃圾回收--判断可触及性
博客搬家自https://my.oschina.net/itsyizu/blog/
垃圾回收的基本思想:
考察每一个对象的可触及性(从根节点开始是否可以访问到这个对象,如果可以,这说明当前对象正在使用,否则,说明这个对象已经不再使用了),一般来说,这个对象就需要被回收了。
但事实上,一个无法触及的对象可以在一定的条件下复活自己,如果是这样,那么对它的回收就是不合理的,为此,需要给出一个对象可以触及性状态的定义。
- 可触及的:从根节点开始,可以到达这个对象
- 可复活的:对象的所有引用都被释放,但是对象有可能在finalize()函数中复活。
- 不可触及的:对象的finalize()函数被调用,但是没有复活,那么就会进入不可触及的状态。
代码来帮忙
下面给出一个例子,该对象在finalize中复活了
public class CanReliveObj {
public static CanReliveObj obj;
public void finalize()
{
try {
super.finalize();
} catch (Throwable ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
System.out.println("CanReliveObj finalize called");
obj=this;
}
public String toString()
{
return "I am CanReliveObj";
}
public static void main(String [] args)
{
obj=new CanReliveObj();
obj=null;
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
if(obj==null)
{
System.out.println("obj is null");
}else
{
System.err.println("you can use obj");
}
System.err.println("第二次gc");
obj=null;
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
if(obj==null)
{
System.out.println("obj is null");
}else
{
System.err.println("you can use obj");
}
}
}

第一次对该对象清理会调用它的finalize函数,虽然系统中的引用已经被清除,但是作为实例方法finalize,对象的this引用依然会被传入方法内部,如果引用外泄,对象就会复活。而finalize函数只会调用一侧,所以,第二次清楚对象的时候,对象就没有机会再复活。
NOTICE
finalize函数是一个非常糟糕的模式,不推荐大家使用finalize函数来释放资源。
因为:
>
- finalize函数有可能发生引用外泄,在无意中复活对象.
- 由于finalize是被系统调用的,调用的时间不明确,因此不是一个很好的资源释放方案,推荐在try-catch-finally语句中进行资源的释放
Java垃圾回收--判断可触及性的更多相关文章
- Java 垃圾回收(GC) 泛读
Java 垃圾回收(GC) 泛读 文章地址:https://segmentfault.com/a/1190000008922319 0. 序言 带着问题去看待 垃圾回收(GC) 会比较好,一般来说主要 ...
- Java垃圾回收机制(Garbage Collection)
引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...
- 【转载】Java垃圾回收机制
原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...
- Java GC系列(2):Java垃圾回收是如何工作的?
本文由 ImportNew - 伍翀 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 本教程是为了理解基本的Java垃圾回收以及它是如何 ...
- Java GC系列(1):Java垃圾回收简介
本文由 ImportNew - 好好先生 翻译自 javapapers. Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Ja ...
- java 垃圾回收(堆内存)、以及栈内存的释放
一.Java的垃圾回收机制———解疑 Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间. 需要注意的是:垃圾回收回收的是无任何引用的 ...
- Java垃圾回收机制_(转载)
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- java 垃圾回收机制 引用类型
Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...
- 【Java】Java垃圾回收机制
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
随机推荐
- 手机自动化测试:appium源码分析之bootstrap九
手机自动化测试:appium源码分析之bootstrap九 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣, ...
- 在ElasticSearch中使用 IK 中文分词插件
我这里集成好了一个自带IK的版本,下载即用, https://github.com/xlb378917466/elasticsearch5.2.include_IK 添加了IK插件意味着你可以使用ik ...
- C++命名空间【转】
本讲基本要求 * 掌握:命名空间的作用及定义:如何使用命名空间. * 了解:使用早期的函数库 重点.难点 ◆命名空间的作用及定义:如何使用命名空间. 在学习本书前面各章时,读者 ...
- ios 添加工程依赖只能生成Generic Xcode Archive 文件原因
问题说明:工程引用了外部类库, 默认生成的archive是 Generic Xcode Archive 格式的 无法发布和生成ipa文件. 解决处理: 1.将Build Settings->De ...
- C#中使用SHA1和MD5加密字符串
SHA1和MD5加密均为不可逆加密.代码如下: using System.Security.Cryptography; //添加Using static void Main(string[] args ...
- 简谈-如何使用Python和R组合完成任务
概述 和那些数据科学比赛不同,在真实的数据科学中,我们可能更多的时间不是在做算法的开发,而是对需求的定义和数据的治理.所以,如何更好的结合现实业务,让数据真正产生价值成了一个更有意义的话题. 数据科学 ...
- 用NodeJS创建一个聊天服务器
Node 是专注于创建网络应用的,网络应用就需要许多I/O(输入/输出)操作.让我们用Node实现有多么简单,并且还能轻松扩展. 创建一个TCP服务器 var net = require('net') ...
- Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析
Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析 0. 前言 个人认为该知识点阅读Android源代码会不仅容易走进死胡同,并且效果并不好,前脚看完后脚忘记,故进行总结, ...
- TreeSet对非自然顺序元素的排序
/* 1. 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储. 2. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该 ...
- [原创]ssget过滤动态块的方式
Autocad在2006增加了新的动态块功能,方便了对块的动态修改,但是修改动态块后,块名会变成一个匿名块,导致无法通过块名来快速过滤. 明经论坛上有人通过全选块后再来遍历筛选,我通过研究简化了这个问 ...