Java内存泄漏?

时间:2016-10-21 20:34:37

标签: java memory-leaks

我的理解是Java没有内存泄漏。通过内存泄漏,我的意思是你不能再访问的内存(不是你可以使用的内存,但你不是)。以下是C中的示例:https://en.wikipedia.org/wiki/Memory_leak#A_simple_example_in_C

一位朋友将我与这两篇文章联系起来:

但是,我没有看到任何迹象表明Java实际上是在泄漏内存,只是存在程序员错误,例如:

  • 存储太多不必要的数据(例如您要附加的列表)
  • 没有足够的内存(并且需要更多的RAM /堆空间)
  • 本机代码无法正确管理其内存
  • 不关闭流或数据库等本地资源
  • 可能是JVM中需要修复的错误

他还提到了循环引用,但我相信Java也会因为跟踪垃圾收集器而处理这些内容。

我对此是否正确?除了我列出的问题之外,Java是否有任何" true"内存泄漏?

2 个答案:

答案 0 :(得分:1)

java中的内存泄漏是通过保留对您认为已删除的对象的引用但是您保留一个或多个引用从根GC(例如静态对象)提供该对象的路径引起的。这意味着JVM必须假设将来可能会访问该对象。它不知道程序员不再需要该对象。

这有点像忘记在C / C ++中释放内存。这里的不同之处在于您忘记删除对它的引用而不是释放对象本身。

在此处详细了解:http://www.w3resource.com/java-tutorial/garbage-collection-in-java.php

您可以在此处查看内存泄漏示例:Creating a memory leak with Java

答案 1 :(得分:0)

当您说类似“ ...我看不到任何迹象表明Java实际上正在泄漏内存,只是有程序员错误...”之类的内容时,您可以在C语言中丢失内存的重新分配上说同样的话。是内存泄漏。

并且如上所述,在Java上下文中,内存泄漏是指某些对象不再由应用程序使用,但是垃圾回收器(GC)无法识别它们为未使用并释放它们。

>

例如,忘记关闭打开的流:

class MemoryLeak {

    private void startLeaking() throws IOException {
        StringBuilder input = new StringBuilder();
        URLConnection conn = new URL("www.example.com/file.txt").openConnection();

        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));        

        while (br.readLine() != null) {
            input.append(br.readLine());
        }
    }

    public static void main(String[] args) throws IOException {
        MemoryLeak ml = new MemoryLeak();
        ml.startLeaking();
    }
}

来自:https://github.com/stas-slu/memory-leak-with-java/tree/master/src/com/memoryleak