文档章节

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");
        }
    }

}


© 著作权归作者所有

共有 人打赏支持
呆萌的我
粉丝 3
博文 15
码字总数 15443
作品 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
JVM内存管理和JVM垃圾回收机制

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

laigous
2014/05/13
0
0
Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法

Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法 Java GC(Garbage Collection)垃圾回收机制,Java VM中,存在自动内存管理和垃圾清理机制。GC机制对JVM(Java Virtual Machine)...

开开心心过
2017/10/17
0
0
详解java垃圾回收机制(转)及finalize方法(转)

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

成长中的菜鸟
2015/03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用xtrabackup完成远程备份

转载收藏,以防丢失 需求 Can I backup remote databases from my local server02-27-2013, 06:17 AMHi, I am using mysqldump so far for taking daily backups of my Production datab......

阿dai
5分钟前
1
0
OSChina 周五乱弹 —— 心情超级好开始乱删库

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 手机党少年们想听歌,请使劲儿戳(这里) 把生命除去上班时间, 都开心不起来。 @真Skr小机灵鬼儿: 你才不孤独呢, 想想你早起, @for。:这...

小小编辑
6分钟前
3
2
为什么你的python版本一团糟?因为少了这个操作

坑人的版本 Python 的版本问题一直是个广被吐槽的黑点。以至于有人调侃说: Python 是世界上最好的两种语言! 在这里我要说明下,对于初学者来说,版本间的语法差异其实并不大。现在刚开始学...

crossin
昨天
2
0
Cannot forward after response has been committed

声名:转载自CSDN 通过toncat启动服务器,可以正常登陆访问,登陆进去选择子系统的时候点击登陆的时候,可是去又回到了登陆界面,如此反复就是不能够进入子系统,查看后台报的错误: java.la...

小橙子的曼曼
昨天
2
0
shell编程(告警系统邮件引擎、运行告警系统)

告警系统邮件引擎 1.如果要使用邮件引擎功能,需要调用mail.py文件,放到/usr/local/sbin/mon/mail/目录下即可,具体内容如下: #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,s...

蛋黄_Yolks
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部