内存泄漏的相关面试

内存泄漏?

当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏。
内存泄露是每个开发者最终都要面对的问题,它是许多问题的根源:反应迟缓,崩溃,高延迟,

算法

大部分垃圾回收语言用的算法称之为 Mark-and-sweep 。算法由以下几步组成:
垃圾回收器创建了一个“roots”列表。Roots 通常是代码中全局变量的引用。JavaScript 中,“window” 对象是一个全局变量,被当作 root 。window 对象总是存在,因此垃圾回收器可以检查它和它的所有子对象是否存在(即不是垃圾);

所有的 roots 被检查和标记为激活(即不是垃圾)。所有的子对象也被递归地检查。从 root 开始的所有对象如果是可达的,它就不被当作垃圾。

所有未被标记的内存会被当做垃圾,收集器现在可以释放内存,归还给操作系统了。

现代的垃圾回收器改良了算法,但是本质是相同的:可达内存被标记,其余的被当作垃圾回收。

哪些会造成内存泄漏

1、原生js标签上写事件,不及时清掉
2、闭包
3、被计时器记得关
3、意外的全局变量
JavaScript 处理未定义变量的方式比较宽松:未定义的变量会在全局对象创建一个新变量。在浏览器中,全局对象是 window

function foo(arg) { 
    bar = "this is a hidden global variable"; }

事实上:

function foo(arg) { 
    window.bar = "this is an explicit global variable"; 
}

函数 foo 内部忘记使用 var ,意外创建了一个全局变量。此例泄露了一个简单的字符串,无伤大雅,但是有更糟的情况。

最详细的

### Java 内存泄漏常见面试题及解答 #### 什么是Java内存泄漏? Java中的内存泄漏是指程序在运行过程中,对象不再被使用,但由于某些原因未能被垃圾回收器(GC)回收,导致内存资源的浪费。这种情况在长期运行的应用中尤为严重,可能导致OutOfMemoryError[^1]。 #### Java内存泄漏和C++内存泄漏的区别是什么? 在C++中,内存泄漏通常是由于程序员忘记手动释放不再使用的内存而导致的;而在Java中,内存泄漏主要是由于对象仍然被引用而无法被GC回收。Java的垃圾回收机制自动管理内存,因此内存泄漏更多是逻辑上的问题,而不是忘记释放内存[^1]。 #### Java内存泄漏的常见原因有哪些? - **长生命周期的对象持有短生命周期对象的引用**:例如静态集合类中持续添加对象而不移除,导致这些对象无法被回收。 - **缓存未清理**:缓存对象没有设置过期策略或容量限制,导致缓存无限增长。 - **监听器和回调未注销**:如事件监听器、观察者模式中的回调函数未及时取消注册。 - **内部类持有外部类引用**:非静态内部类(如匿名内部类)隐式持有外部类的引用,可能导致外部类无法被回收。 - **线程局部变量(ThreadLocal)使用不当**:如果ThreadLocal变量没有正确清除,可能会导致线程池中的线程长时间存活并持有不必要的对象引用[^1]。 #### 如何排查Java内存泄漏? - **使用VisualVM或JConsole等工具**:这些工具可以帮助监控堆内存的使用情况,并分析对象的引用链。 - **生成Heap Dump文件**:通过jmap命令生成堆转储文件,然后使用MAT(Memory Analyzer Tool)进行分析,找出内存占用最高的对象及其引用关系。 - **检查GC日志**:启用GC日志记录,分析Full GC的频率和内存回收效果,判断是否存在内存泄漏的迹象。 - **代码审查**:检查是否有不合理的对象引用、未关闭的资源句柄等问题。 #### Java内存泄漏的解决方案有哪些? - **合理设计对象生命周期**:确保对象在使用完毕后能够被及时释放,避免不必要的强引用。 - **使用弱引用(WeakHashMap)**:对于需要缓存的对象,可以考虑使用`WeakHashMap`,这样当键对象不再被引用时,对应的条目会自动从Map中移除。 - **及时关闭资源**:如IO流、数据库连接等资源应在finally块中关闭,确保不会因为异常而泄露。 - **优化缓存策略**:为缓存设置合理的过期时间和最大容量,防止缓存无限增长。 - **清理ThreadLocal变量**:在线程执行完毕后,调用`remove()`方法清除ThreadLocal变量,避免线程池中的线程持有无效的ThreadLocal实例。 #### 示例:如何使用WeakHashMap避免内存泄漏? ```java import java.util.WeakHashMap; public class CacheExample { private static final WeakHashMap<Key, Value> cache = new WeakHashMap<>(); public static void addToCache(Key key, Value value) { cache.put(key, value); } public static Value getFromCache(Key key) { return cache.get(key); } } ``` 在这个例子中,`Key`对象作为弱引用存储在`WeakHashMap`中。当`Key`对象不再被其他地方引用时,它将被GC回收,对应的`Value`也会从缓存中移除,从而避免了内存泄漏。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值