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.如果方法执行时,该对象重新获取引用,方法仍会继续执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义