面试题答案
一键面试1. 静态集合类导致内存泄漏
- 违背规范:Java中,对象不再被引用时应被垃圾回收。静态集合类生命周期与应用程序一致,若向其中添加对象后未及时移除,即使对象在其他地方不再使用,因集合对其强引用,垃圾回收器无法回收,违背对象不再使用应可回收规范。
- 排查手段:使用MAT(Memory Analyzer Tool)工具,它能生成堆转储快照(Heap Dump)分析。在MAT中查看静态对象引用关系,定位静态集合中长时间未使用对象。也可通过代码审查,检查静态集合操作逻辑,是否存在添加对象后未合理移除情况。
2. 监听器和回调未注销导致内存泄漏
- 违背规范:当注册监听器或回调后,若不再需要使用相关对象,但未注销监听器或回调,被监听对象或回调对象因仍被引用,无法被垃圾回收,违背对象不再使用应可回收规范。
- 排查手段:使用Java自带的VisualVM工具,它可监控应用程序运行状态,查看对象引用情况。在VisualVM中查看对象之间引用链,找到因监听器或回调造成的不合理引用。代码层面,在对象销毁逻辑中添加监听器或回调注销代码,并在代码审查时重点关注。
3. 数据库连接、文件句柄等资源未关闭导致内存泄漏
- 违背规范:Java要求使用完外部资源(如数据库连接、文件句柄)需及时关闭释放资源。若未关闭,这些资源相关对象持续占用内存,且可能导致操作系统资源耗尽,违背资源使用后应及时释放规范。
- 排查手段:利用工具如YourKit Java Profiler,它可监控资源使用情况,定位长时间未关闭的数据库连接、文件句柄等资源对象。代码审查时,检查资源获取和释放代码,确保try - finally块或try - with - resources语句正确使用,保证资源能被正确关闭。