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对象还是逃不过被回收的命运!!
很明显:我们平常对于对象是否被回收的一句规定也是有漏洞的。
堆内存中一个对象如果没有引用指向时,那么是无用对象,会被垃圾回收器回收掉。