如何在 Java 中创建内存泄漏?

如何解决如何在 Java 中创建内存泄漏??

开发过程中遇到如何在 Java 中创建内存泄漏?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在 Java 中创建内存泄漏?的解决方法建议,希望对你解决如何在 Java 中创建内存泄漏?有所启发或帮助;

问题描述

这是在纯 Java 中创建真正的内存泄漏(运行代码无法访问但仍存储在内存中的对象)的好方法

  1. 应用程序创建一个时间运行的线程(或使用线程池更快地泄漏)。
  2. 线程通过(可选自定义)加载一个ClassLoader
  3. 该类分配一大块内存(例如new byte[1000000]),将对其的强引用存储在静态字段中,然后将对自身的引用存储在ThreadLocal. 分配额外的内存是可选的(泄漏类实例就足够了),但它会使泄漏工作得更快。
  4. 应用程序清除所有对自定义类或ClassLoader从其加载的类的引用。
  5. 重复。

由于ThreadLocal在 Oracle 的 JDK 中实现的方式,这会产生内存泄漏:

  • 每个Thread都有一个私有字段threadLocals,它实际上存储线程本地值。
  • 此映射中的每个都是对对象的弱引用ThreadLocal,因此在该ThreadLocal对象被垃圾回收后,它的条目将从映射中删除
  • 但是每个都是一个强引用,因此当一个值(直接或间接)指向作为ThreadLocalkey的对象时,只要线程存在,该对象就不会被垃圾收集或从映射中删除

在此示例中,强引用链如下所示:

Thread对象→threadLocals映射→示例类的实例→示例类→静态ThreadLocal字段→ThreadLocal对象。

ClassLoader创建泄漏中并没有真正发挥作用,它只是因为这个额外的引用链而使泄漏变得更糟:示例类→→ClassLoader它已加载的所有类。在许多 JVM 实现中甚至更糟,尤其是在之前Java 7,因为 classes 和ClassLoaders 被直接分配到 permgen 并且根本没有被垃圾回收。)

这种模式的一个变体是,如果您经常重新部署恰好使用ThreadLocal以某种方式指向自身的 s 的应用程序,应用程序容器(如 Tomcat)可能会像筛子一样泄漏内存。这可能由于许多微妙的原因而发生,并且通常难以调试和/或修复。

最终

class MemorableClass {
    static final ArrayList List = new ArrayList(100);
}

String str = readString(); // read lengthy string any source db,textBox/Jsp etc..
// This will place the string in memory pool from which you can't remove
str.intern();

try {
    BufferedReader br = new BufferedReader(new fileReader(inputfile));
    ...
    ...
} catch (Exception e) {
    e.printstacktrace();
}

try {
    Connection conn = ConnectionFactory.getConnection();
    ...
    ...
} catch (Exception e) {
    e.printstacktrace();
}

,例如通过本机方法分配的内存。

在 Web 应用程序中,一些对象存储在应用程序范围内,直到应用程序被显式停止或删除

getServletContext().setAttribute("SOME_MAP", map);

,例如noclassgcIBM JDK 上阻止未使用的类垃圾收集的选项

解决方法

我刚刚接受了一次面试,我被要求用 Java创建内存泄漏。

不用说,我什至不知道如何开始创建一个

能举一个例子吗?

编程问答问答

我目前正在研究SSIS项目,我需要做一些奇怪的事情。 我需要检查以下几行是否为NULL /空白值,并将该值
我一直在使用slick进行数据库交互,并使用h2内存数据库进行测试。因此,我刚刚添加了一种新方法,在
您将如何创建这样的内容: <a href="https://i.stack.imgur.com/DuGm6.png" rel="nofollow noreferrer"><img src="https://i.
我当前正在使用一个<code>Android</code>应用程序,其中需要使用一些<code>Animation</code>。 当这些<code>Views</cod
我有下一个js应用程序,并且有一个API可以返回1000万个帖子, 我想知道我使用SSG方法执行此操作是标准
在必要的情况下,我想根据域名动态切换到OTHER数据库。我有<strong> database-1 </strong>,其中有<strong> table-1
我的网站上有一些带边框的圆形图标,但是当我将鼠标悬停在图标上时,可以从图标外部看到指针(并
我正在使用html2text转换器将html转换为text。接下来我想做的是-在2行之间提取数据。令人垂涎的html数据看
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注