Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java内存泄漏?_Java_Memory Leaks - Fatal编程技术网

Java内存泄漏?

Java内存泄漏?,java,memory-leaks,Java,Memory Leaks,我的理解是Java没有内存泄漏。所谓内存泄漏,我指的是你不能再访问的内存(不是你可以访问的内存,但你不能)。下面是C语言中的一个示例: 一位朋友将我链接到以下两篇文章: 但是,我没有看到任何迹象表明Java实际上正在泄漏内存,只是存在程序员错误,例如: 存储太多不必要的数据(如您不断添加的列表) 内存不足(需要更多的RAM/堆空间) 本机代码无法正确管理其内存 不关闭本机资源,如流或数据库 JVM中可能存在需要修复的错误 他还提到了循环引用,但我相信Java也能处理这些引用,因为它的

我的理解是Java没有内存泄漏。所谓内存泄漏,我指的是你不能再访问的内存(不是你可以访问的内存,但你不能)。下面是C语言中的一个示例:

一位朋友将我链接到以下两篇文章:

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

  • 存储太多不必要的数据(如您不断添加的列表)
  • 内存不足(需要更多的RAM/堆空间)
  • 本机代码无法正确管理其内存
  • 不关闭本机资源,如流或数据库
  • JVM中可能存在需要修复的错误
他还提到了循环引用,但我相信Java也能处理这些引用,因为它的跟踪垃圾收集器


我说的对吗?除了我列出的问题外,Java是否存在任何“真正的”内存泄漏?

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

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

请在此处阅读更多信息:


你可以在这里看到内存泄漏的例子:

当你说“…我没有看到任何迹象表明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();
    }
}

摘自:

这篇文章可能会涵盖你的所有基础-有很多微妙的情况,对象(尤其是内部类)可以保持不再需要的状态。可能重复的
完全没有足够的内存
,如果你有无限多的内存,你就不会关心泄漏