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

Java中垃圾回收规则

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

例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对象被回收了!!
其实aa对象被回收也是有一定过程的,过程分析:

画图模拟执行过程:

这里写图片描述

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

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

例子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对象还是逃不过被回收的命运!!

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

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

虚拟机垃圾回收图原稿下载

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值