我刚刚接受采访,并被要求使用Java造成内存泄漏。
不用说,我对如何开始创建它一无所知。
一个例子是什么?
这是在纯Java中创建真正的内存泄漏(运行代码无法访问但仍存储在内存中的对象)的好方法:
ClassLoader
。new byte[1000000]
),在静态字段中存储对它的强引用,然后在中存储对自身的引用ThreadLocal
。分配额外的内存是可选的(泄漏类实例就足够了),但是它将使泄漏工作快得多。ClassLoader
从中加载的所有引用。由于该方法ThreadLocal
是在Oracle的JDK中实现的,因此会造成内存泄漏:
Thread
都有一个私有字段threadLocals
,该字段实际存储线程局部值。ThreadLocal
对象的弱引用,因此在对该ThreadLocal
对象进行垃圾回收之后,其条目将从映射中删除。ThreadLocal
作为其键的对象时,只要线程存在,该对象就不会被垃圾回收或从映射中删除。在此示例中,强引用链如下所示:
Thread
对象→threadLocals
地图→示例类的实例→示例类→静态ThreadLocal
字段→ThreadLocal
对象。
(ClassLoader
在创建泄漏中并没有真正起作用,它只是由于以下附加参考链而使泄漏更糟:示例类→→ClassLoader
它已加载的所有类。在许多JVM实现中,甚至在更糟糕的情况下,情况甚至更糟。 Java 7,因为类和ClassLoader
s被直接分配到permgen中,并且根本没有被垃圾收集。)
这种模式的一种变体是,如果您频繁地重新部署碰巧使用ThreadLocal
s的应用程序,而应用程序容器(例如Tomcat)像sieve那样以某种方式指向自身,那么它可以像筛子一样泄漏内存。发生这种情况的原因很多,通常很难调试和/或修复。
更新:由于很多人一直在要求它,因此以下示例代码展示了这种行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句