文档章节

java 垃圾回收机制

呆萌的我
 呆萌的我
发布于 2015/10/18 15:44
字数 953
阅读 21
收藏 0
很多书中提到,判断一个对象是否应该存活,是使用程序计数器的,对象有一个引用计数器,每当一个地方引用,计数器就加1,引用失效,计数器减1,当计数为0,该对象可以被回收。

引用计数器算法的实现简单,判定效率也很高,但是,java虚拟机里面没有选用计数器算法来管理内存,主要原因是它很难解决对象之间的循环引用问题。
public class TestGC {

    public Object obj = null;    public static void main(String[] args) {
        TestGC gc1 = new TestGC();
        TestGC gc2 = new TestGC();

        gc1.obj = gc2;
        gc2.obj = gc1;

        gc1 = null;
        gc2 = null;

        System.gc();
    }

}

对象gc1、gc2已经被gc回收,如果采用计数器算法,将造成内存泄漏。

可达性分析算法

    基本思想是通过一系列的“GC Roots”对象作为起点,向下搜索,搜索所经过的路径称为引用链,当一个对象到GC Roots没有任何引用引用链,此对象可以被回收.

jdk1.2之后,java对引用的概念进行了扩充,将分为强引用、软引用、弱引用、虚饮用四种:

  • 强引用类似于Object obj = new Object();强引用还存在,垃圾收集器永远不会回收被引用对象。

  • 引用描述一些还在用,但并非必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列入回收范围之中进行第二次回收。如果回收后还没有足够内存,抛出异常。

  • 弱引用描述非必要对象,比弱引用更弱一些,被引用关联的对象只能生存在下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉被弱引用关联的对象。

  • 虚引用:一个对象是否存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的主要目的就是能在这个对象被收集器回收时收到一个系统通知。

    要宣布一个对象的死亡,需要经历两个过程:

    如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将两种情况都视为“没有必要执行”。

    如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会放置在一个F-Queue的队列中,并稍后由一个虚拟机自动建立,低优先级的Finalizer线程去执行它。但并不是立即执行,因为如果finalize()方法执行缓慢或者死循环,可能导致整个内存回收系统崩溃。如果在finalize()中将this赋值一个变量,第二次标记时将会被移除“即将回收”的集合。

public class FinalEscapeGC {

    public static FinalEscapeGC SAVE_HOOK = null;
    public  void isAlive() {
        System.out.println("FinalEscapeGC.isAlive()");
    }
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("FinalEscapeGC.finalize()");
        FinalEscapeGC.SAVE_HOOK = this;
    }
    public static void main(String[] args) throws InterruptedException {

        SAVE_HOOK = new FinalEscapeGC();        //对象第一次成功自救
        SAVE_HOOK = null;
        System.gc();

        Thread.sleep(500);
        if(SAVE_HOOK != null) {
            SAVE_HOOK.isAlive();
        }   else {
            System.out.println("is deed");
        }        //由于finalize只会被执行一次,所以自救失败
        SAVE_HOOK = null;
        System.gc();
        
        Thread.sleep(500);
        if(SAVE_HOOK != null) {
            SAVE_HOOK.isAlive();
        }   else {
            System.out.println("is deed");
        }
    }

}


© 著作权归作者所有

共有 人打赏支持
呆萌的我
粉丝 4
博文 15
码字总数 15443
作品 0
天津
私信 提问
JVM内存管理和JVM垃圾回收机制

你对JVM内存组成结构和JVM垃圾回收机制是否熟悉,这里和大家简单分享一下,希望对你的学习有所帮助,首先来看一下JVM内存结构,它是由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示...

laigous
2014/05/13
0
0
详解java垃圾回收机制(转)及finalize方法(转)

详细介绍Java垃圾回收机制 垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收...

成长中的菜鸟
2015/03/06
0
0
My java——JVM(垃圾回收)四

续My java——JVM(内存域) 中讲述了Java在JVM中的内存使用,其实在我们出来java程序时基本上有两个地方的内存处理 一是栈、二是堆,JVM会自动回收堆中的内存,也就我们所说的垃圾回收,那J...

tngou
2013/03/20
0
0
Java GC系列:Java垃圾回收详解

Java的内存分配与回收全部由JVM垃圾回收进程自动完成。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。 ...

满风
2015/04/10
0
0
JAVA内存管理和JVM运行机制、垃圾回收、内存调优

一、JAVA内存管理 java是跨平台语言,java预编译.class文件放置JVM虚拟机中运行; Java的内存结构,也就是运行时的数据区域 运行时数据区 方法区:常量池、变量等存储地方;(持久区) 堆:实...

盼望明天
08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

重磅!亚洲诚信实力斩获:“2018 DigiCert/Symantec 年度最佳创新合作伙伴”大奖

2018年11月13日-16日,全球顶级数字证书厂商,DigiCert/Symantec亚太区圆桌会议(Asia Partner Roundtable 2018)在日本大阪隆重召开。 亚洲诚信作为DigiCert/Symantec亚太区白金战略合作伙伴和...

亚洲诚信
25分钟前
2
0
始于阿里,回归社区:阿里8个项目进入CNCF云原生全景图

摘要: 一群技术理想主义者,与太平洋另一边的技术高手们正面PK,在这场躲不开的战役中,一起认真一把。 破土而出的生命力,源自理想主义者心底对技术的信念。 云原生技术正席卷全球,云原生...

阿里云官方博客
32分钟前
3
0
修改this指向(bind、call 和 apply)

一、bind bind 的其中一个用法就是:绑定函数,使其无论怎么样调用都用相同的 this 示例: var obj = { getThis: function() { console.log(this); }};obj.getThis()...

文文1
今天
1
0
WSL安装JDK8

下载地址 JDK_URL https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html UNLIMITED_STRENGTH_URL https://www.oracle.com/technetwork/java/javase/down......

terwergreen
今天
4
0
sparkStreaming基本概念

概述 Spark Streaming 是 Spark Core API 的扩展, 它支持弹性的, 高吞吐的, 容错的实时数据流的处理. 数据可以通过多种数据源获取, 例如 Kafka, Flume, Kinesis 以及 TCP sockets, 也可以通过...

freeli
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部