即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

Java语言中的垃圾回收概述及注意点

编程语言 Marvel__Dead 21℃ 0评论
本文目录
[隐藏]

1.Java中垃圾回收规则

  • 堆内存中一个对象如果没有引用指向时,那么是无用对象,会被垃圾回收器回收掉。
  • Java程序员可以调用System.gc()通知虚拟机进行垃圾回收,但是具体垃圾回收时间不确定,由Java虚拟机进行判断。

2.例1:

public class Rubbish {
    public static void main(String[] args) {
        test();

        System.gc();//通知虚拟机进行垃圾回收

        System.out.println("Main方法已经执行完毕。");
    }
    public static void test(){
        AA aa=new AA();

        System.out.println(aa.hashCode());
    }
}

class AA{
    /*
     * 该方法会在对象被回收前被虚拟机调用。
     */
    @Override
    protected void finalize() throws Throwable {
        System.out.println("AAAAAAAAAAAAAA对象被回收了!!");
    }
}

说说test方法中的aa对象是否会被回收??

答案是肯定的,一定会被JVM回收!!

输出结果:

366712642
Main方法已经执行完毕。
AAAAAAAAAAAAAA对象被回收了!!

2.1.1.其实aa对象被回收也是有一定过程的,过程分析:

画图模拟执行过程:

这里写图片描述

为什么会被回收??aa变量会随着test()方法执行完毕而被销毁。

所以aa变量被销毁后,也就没有指向aa对象的变量了。最终aa对象会被垃圾回收器回收。

3.例子2

public class Rubbish02 {
    public static void main(String[] args) {
        test();

        System.gc();

        System.out.println("主方法已经执行完毕!!!");
    }
    public static void test(){
        AAA aaa=new AAA();
        BBB bbb=new BBB();

        aaa.b=bbb;
        bbb.a=aaa;
    }

}

class AAA{

    public BBB b;

    @Override
    protected void finalize() throws Throwable {
        System.out.println("AAAAA被垃圾回收器回收了!!!");
    }
}
class BBB{
    public AAA a;

    @Override
    protected void finalize() throws Throwable {
        System.out.println("BBBBBB被垃圾回收器回收了!!!");
    }
}

各位觉得aaa对象和bbb对象是否会被垃圾回收器给回收掉??

答案还是肯定的!aaa和bbb两个对象都会被垃圾回收器给回收掉!!!

输出结果:

BBBBBB被垃圾回收器回收了!!!
AAAAA被垃圾回收器回收了!!!
主方法已经执行完毕!!!

为什么呢??

看图解释:

这里写图片描述

我们都知道,aaa和bbb两个变量随着test()方法结束而被销毁掉。但是aaa对象里面和bbb对象里面互相保存着对方。这样我们就有点不肯定两个对象是否被回收了。

其实一点也不难判断。

看图:

这里写图片描述

规定:只要没有直接或者间接跟Execute子系统有关系的对象,都会被当成垃圾给回收掉!!有连线就是有关系!!

很明显本来aaa和bbb对象根据aaa变量和bbb变量间接的跟Execute子系统有关系的。但是随着test()方法结束,aaa和bbb变量都被回收了。所以aaa和bbb对象也就和Execute子系统没有关系了。虽然aaa对象和bbb对象互相关联,但是aaa对象和bbb对象还是逃不过被回收的命运!!

很明显:我们平常对于对象是否被回收的一句规定也是有漏洞的。

堆内存中一个对象如果没有引用指向时,那么是无用对象,会被垃圾回收器回收掉。

转载请注明:CodingBlog » Java语言中的垃圾回收概述及注意点

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情