MST
星途 面试题库

面试题:Java内存泄漏场景及基于规范的排查方法

列举至少三种在Java编程中可能导致内存泄漏的场景,说明每种场景违背了哪些Java内存使用规范,并阐述如何基于这些规范来排查内存泄漏问题,例如使用哪些工具及手段。
21.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 静态集合类导致内存泄漏

  • 违背规范:Java中,对象不再被引用时应被垃圾回收。静态集合类生命周期与应用程序一致,若向其中添加对象后未及时移除,即使对象在其他地方不再使用,因集合对其强引用,垃圾回收器无法回收,违背对象不再使用应可回收规范。
  • 排查手段:使用MAT(Memory Analyzer Tool)工具,它能生成堆转储快照(Heap Dump)分析。在MAT中查看静态对象引用关系,定位静态集合中长时间未使用对象。也可通过代码审查,检查静态集合操作逻辑,是否存在添加对象后未合理移除情况。

2. 监听器和回调未注销导致内存泄漏

  • 违背规范:当注册监听器或回调后,若不再需要使用相关对象,但未注销监听器或回调,被监听对象或回调对象因仍被引用,无法被垃圾回收,违背对象不再使用应可回收规范。
  • 排查手段:使用Java自带的VisualVM工具,它可监控应用程序运行状态,查看对象引用情况。在VisualVM中查看对象之间引用链,找到因监听器或回调造成的不合理引用。代码层面,在对象销毁逻辑中添加监听器或回调注销代码,并在代码审查时重点关注。

3. 数据库连接、文件句柄等资源未关闭导致内存泄漏

  • 违背规范:Java要求使用完外部资源(如数据库连接、文件句柄)需及时关闭释放资源。若未关闭,这些资源相关对象持续占用内存,且可能导致操作系统资源耗尽,违背资源使用后应及时释放规范。
  • 排查手段:利用工具如YourKit Java Profiler,它可监控资源使用情况,定位长时间未关闭的数据库连接、文件句柄等资源对象。代码审查时,检查资源获取和释放代码,确保try - finally块或try - with - resources语句正确使用,保证资源能被正确关闭。