java 对象回收_java 对象与垃圾回收

C语言要求程序员显示的分配内存,释放内存

java语言不要求程序员分配内存和释放内存,避免很多潜在的问题。java在创建对象时自动分配内存,并当该对象的引用不存在时释放这块内存

回收机制有如下特点:

只负责回收堆内存中的对象,不负责回收物理资源,例如数据库连接

程序无法控制垃圾回收什么时候进行,它会在合适的时候进行

回收任何对象之前先调用finalize()方法,能够使对象恢复,让一个引用变量引用该对象,

对象在内存中的三种状态:

可达状态:对象创建之后,有一个或者多个引用变量指向改对象,可以通过这些引用变量调用该对象的实例变量和实例方法

可恢复状态:程序中某个对象没有引用变量,为可恢复状态,在这个状态下,系统的垃圾回收机制准备回收该对象所占内存,回收之前会调用finalize()方法,如果系统在调用此方法时能够让一个引用变量重新引用该对象,则进入可达状态,否则进入不可达状态。

不可达状态:当对象与其他任何引用变量没有关联,且已经执行了finalize()方法仍然没有进入可达状态,则永久性的失去引用。只有是不可达状态的对象才能被回收

fdc16834412f86822d55f6e77c20e437.png

强制垃圾回收:

程序只能控制一个对象何时不再被任何引用变量引用,但是不能控制何时被回收

强制系统进行垃圾回收——只是通知系统进行垃圾回收

强制垃圾回收有两种方式:

System.gc()

RunTime.getRunTime().gc()

public classtest1 {public static voidmain(String[] args) {for(int i=0;i<10;i++){newtest1();

}

}

@Overrideprotected void finalize() throwsThrowable {//TODO Auto-generated method stub

System.out.println("调用finalize");

}

}

运行上面代码,没有任何输出,系统并没有调用finalize()

public classtest1 {public static voidmain(String[] args) {for(int i=0;i<10;i++){newtest1();//System.gc();

Runtime.getRuntime().gc();

}

}

@Overrideprotected void finalize() throwsThrowable {//TODO Auto-generated method stub

System.out.println("调用finalize");

}

}

加上 //System.gc(); Runtime.getRuntime().gc();任何一句会调用finalize(),但是只是建议回收机制回收,可能不会立即回收

finalize()方法:

在垃圾回收机制准备回收某对象所占用内存之前会先清理资源,如果没有明确指定回收资源的情况下,java会提供默认清理该对象资源的机制,为finalize()方法

任何object类都可以重写finalize()方法

垃圾回收机制调用该对象的finalize()是透明的,不能明确什么时候会调用,只有在程序认为需要更多额外内存,垃圾回收机制才会进行垃圾回收

finalize()有如下四个特点:

不会主动调用某个对象的finalize()方法,交给回收机制进行调用

finalize()是否会被调用,何时调用,是不确定的,不是一个一定会执行的方法

当JVM执行finalize()方法时,可能会使该对象及程序中的其他对象重新回到可达状态

当JVM执行finalize()方法出现异常时,不会报异常,会继续执行程序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值