写点什么

说说内存泄漏的常见场景和排查方案?

作者:王磊
  • 2025-08-13
    陕西
  • 本文字数:1238 字

    阅读完需:约 4 分钟

说说内存泄漏的常见场景和排查方案?

内存泄漏是指程序中某些对象不再被使用,但由于仍然被引用,垃圾回收器无法回收这些对象,导致内存被持续占用的问题。


PS:这就像桶破了个洞,水慢慢漏出,最终桶里的水会越来越少。

内存泄漏 ≠ 内存溢出

这里需要注意的内存泄漏和内存溢出是不同的内存溢出是指程序在申请内存时,系统无法提供足够的可用内存空间以满足需求,导致程序崩溃或异常。这就像往一个固定容量的桶里倒水,当水超过桶的容量时就会溢出。


所以说,长期的内存泄漏最终会导致内存溢出

内存泄漏常见场景

内存泄漏的常见场景如下:


  1. ThreadLocal 使用不当:线程池中未清理 ThreadLocal,示例代码如下:


// ThreadLocal未 remove 导致泄漏private static ThreadLocal<BigObject> threadLocal = new ThreadLocal<>();public void processRequest() {    threadLocal.set(new BigObject());    // 使用后未调用 threadLocal.remove()}
复制代码


  1. 未关闭资源:文件流、数据库连接等未关闭,示例代码如下:


// 文件流未关闭导致泄漏public void fileLeak() throws Exception {FileInputStream fis = new FileInputStream("largeFile.txt");// 忘记调用 fis.close()}
复制代码


  1. 监听器未注销:注册的事件监听器未移除,示例代码如下:


public class EventSource {    private List<EventListener> listeners = new ArrayList<>();    public void addListener(EventListener listener) {        listeners.add(listener); // 缺少 removeListener方法    }}
复制代码


  1. 静态集合滥用:静态集合长期持有对象引用,示例代码如下:


// 静态集合导致内存泄漏private static List<Object> cache = new ArrayList<>();public void addToCache(Object obj) {cache.add(obj); // 添加后从不移除}
复制代码


  1. 不正确的 equals/hashCode:导致 HashMap 无法正确识别相同对象,示例代码如下:


// 未重写 equals/hashCode 导致 HashMap 内存泄漏Map<Person, Integer> map = new HashMap<>();for(int i=0; i<100; i++) {    map.put(new Person("jon"), 1); // 每次都被视为新对象}
复制代码

内存泄漏排查

内存泄漏的排查步骤如下:


  1. 监控内存使用趋势

  2. 使用 jconsole 或 jvisualvm 观察内存是否持续增长。

  3. 关注 Full GC 后内存是否回落。

  4. 堆转储分析

  5. 使用 Eclipse MAT 分析堆转储文件。

  6. 查看 Dominator Tree 找出占用内存最多的对象。

  7. 检查 Reference Chain 定位阻止回收的引用。

  8. 代码审查

  9. 静态集合的使用情况。

  10. 资源关闭逻辑(try-with-resources)。

  11. 监听器的注销机制。

  12. ThreadLocal 的 remove 调用。

小结

内存泄漏是指程序中某些对象不再被使用,但由于仍然被引用,垃圾回收器无法回收这些对象,导致内存被持续占用的问题。长期的内存泄漏会导致内存溢出问题,但内存泄漏不等于内存溢出,这点面试的时候一定要注意。


本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:场景题、SpringAI、SpringAIAlibaba、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列、Dify、Coze、AI 常见面试题等。

用户头像

王磊

关注

javacn.site 2018-08-25 加入

我的小站:javacn.site

评论

发布
暂无评论
说说内存泄漏的常见场景和排查方案?_王磊_InfoQ写作社区