主要观点:Java 中所有对象隐式继承自java.lang.Object
,finalize()
方法可在子类中重写用于关闭类中打开的资源,但此方法有缺点,已在 Java 9 中被弃用,应避免使用。
关键信息:
- 未妥善处理的
finalize()
方法会导致OutOfMemoryError
,如示例程序中不断创建SlowFinalizerObject
且finalize()
方法执行时间长,会使Finalizer
线程卡住,内部队列堆积,超出内存分配大小时抛出错误。 - 诊断
finalize()
方法创建的内存泄漏需捕获堆转储(如通过-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<FILE_PATH_LOCATION>
)并使用工具分析,如 HeapHero 可利用机器学习算法检测内存泄漏模式。 - 替代
finalize()
方法的策略有使用try-with-resources
、java.lang.ref.Cleaner
、java.lang.ref.PhantomReference
、设计显式清理方法等。
重要细节: - 示例程序中
SlowFinalizerObject
在创建时会生成巨大字符串并在finalize()
方法中模拟长时间执行,导致OutOfMemoryError
,移除finalize()
方法则程序可正常运行。 - HeapHero 工具可分析堆转储,通过“Largest Objects”和“Outgoing Reference”等部分指出
java.lang.ref.Finalizer
类占用大量内存及内存泄漏对象及其来源。 - 替代
finalize()
方法的策略各有特点,try-with-resources
可保证资源及时清理,Cleaner
更安全,PhantomReference
可监控对象收集,显式清理方法让开发者可控资源管理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。