java - InputStream 内存泄漏?

标签 java memory-management stream garbage-collection inputstream

我正在使用 Java 制作一个保存和加载文件的应用程序,因此我使用的是流。我从一个文件中获取一个流,然后使用该流在另一个文件夹中创建一个新文件。问题是,在使用流并关闭它之后,应该释放的内存仍然存在。

例如,我加载了一个 100mb 的文件(任务管理器显示 java.exe 增加了 100mb),然后我将该文件保存在另一个文件夹中并使用 stream.close() 关闭流。但是 java.exe 不会减少 100mb。当我多次保存和加载文件时,java.exe 超过 600mb,然后减少到 300mb。每次它即将超过 600mb 时,它就会减少到 300mb。为什么是这样?为什么调用 stream.close() 时内存不能变为 0mb?为什么它在大约 600mb 时释放内存,而不释放所有内存?

这是我从字符串路径加载流然后关闭流的方式:

String path = ... //File path
InputStream stream = new BufferedInputStream(new FileInputStream(path));
stream.close();

感谢您的回复。

最佳答案

BufferedInputStream 默认使用 8 KB 的固定大小,因此它不会泄漏超过 8 KB(加上一点开销)

I load a 100mb file (the task manager shows that java.exe increases in 100mb),

这意味着您正在使用 100 MB 的对象来处理该文件。

But java.exe doesn't decrease 100mb

没有理由它应该。它很可能会在 GC 之后发生,但除非你需要,否则你不想这样做,我怀疑你不想这样做。

Every time it's about to exceed 600mb it reduces to 300mb. Why is this?

您触发了垃圾收集。很可能是次要 Collection 。

Why can't the memory go to 0mb when I invoke stream.close() ?

它开始时不是 0 MB,当你 GC 时你会收回内存,但你不想做不必要的事情。

Why does it free memory when it's aroung 600mb, and it doesn't free all the memory?

它有多个内存区域,它试图做最简单的工作,通常是清理伊甸园空间。

关于java - InputStream 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12606514/

相关文章:

java - 为什么这个线程池不被垃圾收集?

java - 连接部署在tomcat上的web服务时出错?

java - 可以在导出的 jar/apk 中智能排除 jar 吗?

java - 如何具备http调用方法的能力?

c++ - delete[] 是否在调用析构函数后一次性释放内存?

java - 检查特定对象属性在列表中是否唯一

c# - 在 C# 流上使用 DisposeAsync 的正确方法

c - 操作系统内存管理,段错误?

代码在 macOS 上逻辑上有效,但在 Ubuntu 16.04.5 上无效

javascript - 如何将可写流写入无处?