主要观点:Java 中的WeakReference
类常被视为解决内存泄漏的方法,但仅靠弱引用不一定能解决问题,文中通过一个示例展示了在finalize()
方法存在问题时会导致内存泄漏。
关键信息:
- 默认对象有强引用,弱引用不会阻止对象被垃圾回收,若弱引用是对象唯一指针则随时可能被回收。
finalize()
方法在对象被垃圾回收前执行,旨在让程序员执行清理任务,但 Java 9 起已弃用,垃圾回收器工作流程及finalize()
方法可能出现的问题(等待资源导致队列中其他对象内存无法释放、方法不一定能执行)。- 示例中
BuggyClass
类在finalize()
方法中有无限循环导致内存泄漏,TestClass
用弱引用创建BuggyClass
对象但因BuggyClass
的问题垃圾回收器无法回收内存,主程序创建TestClass
对象后运行程序仅一个对象的finalize()
方法被调用,其他仍在队列中,通过 HeapHero 工具可看到内存未被释放。
重要细节: WeakReference
类的使用方式及作用场景,如用于传递给后台进程的对象。- 垃圾回收器工作流程中对象的标记和
finalize()
方法的调用顺序。 BuggyClass
类中finalize()
方法的具体代码及导致的问题。TestClass
中创建弱引用对象及methodA
方法的实现。- 通过 HeapHero 工具查看内存保留情况的相关内容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。