Java内存泄漏?
我的理解是Java没有内存泄漏。所谓内存泄漏,我指的是你不能再访问的内存(不是你可以访问的内存,但你不能)。下面是C语言中的一个示例: 一位朋友将我链接到以下两篇文章:Java内存泄漏?,java,memory-leaks,Java,Memory Leaks,我的理解是Java没有内存泄漏。所谓内存泄漏,我指的是你不能再访问的内存(不是你可以访问的内存,但你不能)。下面是C语言中的一个示例: 一位朋友将我链接到以下两篇文章: 但是,我没有看到任何迹象表明Java实际上正在泄漏内存,只是存在程序员错误,例如: 存储太多不必要的数据(如您不断添加的列表) 内存不足(需要更多的RAM/堆空间) 本机代码无法正确管理其内存 不关闭本机资源,如流或数据库 JVM中可能存在需要修复的错误 他还提到了循环引用,但我相信Java也能处理这些引用,因为它的
- 存储太多不必要的数据(如您不断添加的列表)
- 内存不足(需要更多的RAM/堆空间)
- 本机代码无法正确管理其内存
- 不关闭本机资源,如流或数据库
- JVM中可能存在需要修复的错误
我说的对吗?除了我列出的问题外,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();
}
}
摘自:这篇文章可能会涵盖你的所有基础-有很多微妙的情况,对象(尤其是内部类)可以保持不再需要的状态。可能重复的
完全没有足够的内存
,如果你有无限多的内存,你就不会关心泄漏