高级 Java 垃圾回收概念:弱引用、终结器和内存泄漏

主要观点:Java 中的WeakReference类常被视为解决内存泄漏的方法,但仅靠弱引用不一定能解决问题,文中通过一个示例展示了在finalize()方法存在问题时会导致内存泄漏。
关键信息

  • 默认对象有强引用,弱引用不会阻止对象被垃圾回收,若弱引用是对象唯一指针则随时可能被回收。
  • finalize()方法在对象被垃圾回收前执行,旨在让程序员执行清理任务,但 Java 9 起已弃用,垃圾回收器工作流程及finalize()方法可能出现的问题(等待资源导致队列中其他对象内存无法释放、方法不一定能执行)。
  • 示例中BuggyClass类在finalize()方法中有无限循环导致内存泄漏,TestClass用弱引用创建BuggyClass对象但因BuggyClass的问题垃圾回收器无法回收内存,主程序创建TestClass对象后运行程序仅一个对象的finalize()方法被调用,其他仍在队列中,通过 HeapHero 工具可看到内存未被释放。
    重要细节
  • WeakReference类的使用方式及作用场景,如用于传递给后台进程的对象。
  • 垃圾回收器工作流程中对象的标记和finalize()方法的调用顺序。
  • BuggyClass类中finalize()方法的具体代码及导致的问题。
  • TestClass中创建弱引用对象及methodA方法的实现。
  • 通过 HeapHero 工具查看内存保留情况的相关内容。
阅读 198
0 条评论