Java随笔,垃圾回收机制初理解

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

可达状态:
  有引用指向对象时。
可恢复状态:
  没有引用指向该对象时,程序会通知系统垃圾回收,但是在垃圾回收前,系统调用该对象的finalize()
  重新让一个引用指向该对象,这就是可回复状态,恢复到可达状态。

不可达状态:
  没有引用指向对象,并且在系统调用该对象finalize()后,
  仍然没有引用指向时,这个对象就会被垃圾回收

但是,大部分情况,对象失去引用后,程序只是通知系统进行垃圾回收,但系统什么时候进行垃圾回收无法确定;

 

  系统在进行垃圾回收时,会调用回收对象的finalize()方法,若方法结束还没有引用指向,则回收资源,对象死亡。

  正是因为系统进行垃圾回收的时间无法确定,java给了两个api;
  分别是:System.gc(),和Runtime.getRuntime.gc()
  两个方法结果相同,都是让系统立刻对失去引用对象进行垃圾回收,届时,如果重写了该对象的finalize()方法,
  则系统会执行它,如果没有重写,则会执行object的finalize方法。

不过,如果当前程序执行完毕或线程死亡,系统还没进行垃圾回收,则不会运行该对象的finalize()方法。

如果出现这种情况,可能是这种情况:

  某个失去引用的对象只占用了少量内存,且系统并没有产生严重的内存需求,因此系统并没有立刻回收该对象占用的资源,所以finalize()方法也不会被调用。

 

finalize()方法的注意事项:

  JVM执行finalize()方法时,是创建一个名为Finalizer的线程来执行的

  1.永远不要主动调用某个对象的finalize()方法,将这个方法交给垃圾处理机制去调用。

  2.finalize()方法是否会调用,何时调用无法确定,所以不要将finalize()方法当作一定会被执行的方法。

  3.JVM执行某一对象的finalize()方法时,可能会使其他失去引用对象回到可达状态。

  4.JVM执行finalize()方法时,如果发生异常,垃圾回收机制不会报告,程序继续执行。

  5.如果方法执行时发生异常,控制台不会打印异常,但是方法会直接终止。

  6.如果方法执行时,该对象重新获取引用,方法仍会继续执行。

posted @   MrPPP  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示