摘要:这里需要注意的内存泄漏和内存溢出是不同的,内存溢出是指程序在申请内存时,系统无法提供足够的可用内存空间以满足需求,导致程序崩溃或异常。这就像往一个固定容量的桶里倒水,当水超过桶的容量时就会溢出。
内存泄漏是指程序中某些对象不再被使用,但由于仍然被引用,垃圾回收器无法回收这些对象,导致内存被持续占用的问题。
PS:这就像桶破了个洞,水慢慢漏出,最终桶里的水会越来越少。
这里需要注意的内存泄漏和内存溢出是不同的,内存溢出是指程序在申请内存时,系统无法提供足够的可用内存空间以满足需求,导致程序崩溃或异常。这就像往一个固定容量的桶里倒水,当水超过桶的容量时就会溢出。
所以说,长期的内存泄漏最终会导致内存溢出。
// ThreadLocal未 remove 导致泄漏private static ThreadLocalthreadLocal = new ThreadLocal;public void processRequest { threadLocal.set(new BigObject); // 使用后未调用 threadLocal.remove}未关闭资源:文件流、数据库连接等未关闭,示例代码如下:// 文件流未关闭导致泄漏public void fileLeak throws Exception {FileInputStream fis = new FileInputStream("largeFile.txt");// 忘记调用 fis.close}监听器未注销:注册的事件监听器未移除,示例代码如下:public class EventSource { private Listlisteners = new ArrayList; public void addListener(EventListener listener) { listeners.add(listener); // 缺少 removeListener方法 }}静态集合滥用:静态集合长期持有对象引用,示例代码如下:// 静态集合导致内存泄漏private static List cache = new ArrayList;public void addToCache(Object obj) {cache.add(obj); // 添加后从不移除}不正确的equals/hashCode:导致 HashMap 无法正确识别相同对象,示例代码如下:// 未重写 equals/hashCode 导致 HashMap 内存泄漏Mapmap = new HashMap;for(int i=0; i
监控内存使用趋势:使用 jconsole 或 jvisualvm 观察内存是否持续增长。关注 Full GC 后内存是否回落。堆转储分析:使用 Eclipse MAT 分析堆转储文件。查看 Dominator Tree 找出占用内存最多的对象。检查 Reference Chain 定位阻止回收的引用。内存泄漏是指程序中某些对象不再被使用,但由于仍然被引用,垃圾回收器无法回收这些对象,导致内存被持续占用的问题。长期的内存泄漏会导致内存溢出问题,但内存泄漏不等于内存溢出,这点面试的时候一定要注意。
本文已收录到我的面试小站 [www.javacn.site](https://www.javacn.site),其中包含的内容有:场景题、SpringAI、SpringAIAlibaba、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列、Dify、Coze、AI常见面试题等。
来源:磊哥聊编程
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!