当前位置: 首页 > 知识库问答 >
问题:

输入流内存泄漏?

谯阳伯
2023-03-14

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

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

这就是我如何从字符串路径加载流,然后关闭流:

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

谢谢你的回复。

共有3个答案

邵伟
2023-03-14

在代码中,FileInputStream是匿名实例。

由于文件较大,它可能存储在虚拟内存/虚拟内存中。它不会关闭,直到java开始垃圾收集。

将FileInputStream创建为新的命名实例并关闭

应该行得通

齐俊贤
2023-03-14

您看到的是Java内存系统的正常运作,分配的内存不一定会还给操作系统

而不是检查java的内存。在操作系统级别上,您应该使用内存分析器,如内置的JConsole工具(或用于更深入分析的免费EclipseMat)。

曹浩淼
2023-03-14

BufferedInputStream在默认情况下使用8 KB的固定大小,因此其泄漏不会超过8 KB(外加一点开销)

我加载一个100mb的文件(任务管理器显示java.exe在100mb增加),

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

但java.exe不会减少100mb

没有理由。它很可能会在GC之后出现,但你不想这样做,除非你需要,我怀疑你不会。

每当它超过600mb,它就会减少到300mb。这是为什么呢?

你有一堆垃圾。很可能是一个小收藏。

为什么调用流时内存不能达到0mb。close()?

它开始时不是0 MB,您将在GC时恢复内存,但您不想不必要地这样做。

为什么它在大约600mb时释放内存,但却不能释放所有内存?

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

 类似资料:
  • 问题内容: 我认为我的android应用正在泄漏内存。我不是绝对确定这是问题所在。 应用程序打开时经常崩溃,并且logcat尝试加载位图图像时会显示“内存不足”异常。 崩溃后,我重新打开了该应用程序,它运行正常。Logcat会显示许多“ gc”,并且JIT表会不时地向上调整大小,而不会向下调整,直到应用程序因内存不足错误而崩溃。 这听起来像是内存泄漏吗?如果是这样,我该如何定位和关闭泄漏点。 这是

  • 问题内容: 我一直在追寻内存泄漏(由“ valgrind –leak-check = yes”报告),它似乎来自ALSA。这段代码已经存在于自由世界中一段时间​​了,所以我猜这是我做错的事情。 输出看起来像这样: 并继续一些页面 这是由于我在一个项目中使用ALSA并开始看到这种巨大的泄漏……或者至少是所说泄漏的报告。 所以问题是:是我,ALSA或valgrind在这里遇到问题吗? 问题答案: ht

  • 问题内容: 我有一个长时间运行的脚本,如果让脚本运行足够长的时间,它将消耗系统上的所有内存。 在不详细介绍脚本的情况下,我有两个问题: 是否有可遵循的“最佳实践”,以防止泄漏发生? 有什么技术可以调试Python中的内存泄漏? 问题答案: 看看这篇文章:跟踪python内存泄漏 另外,请注意,垃圾收集模块实际上可以设置调试标志。看一下功能。此外,请查看Gnibbler的这段代码,以确定调用后已创建

  • 本文向大家介绍Java 内存泄漏,包括了Java 内存泄漏的使用技巧和注意事项,需要的朋友参考一下 在Java中,垃圾回收(析构函数的工作)是使用垃圾回收自动完成的。但是,如果代码中有引用它们的对象怎么办?它无法取消分配,即无法清除其内存。如果这种情况一再发生,并且创建或引用的对象根本没有被使用,它们就会变得无用。这就是所谓的内存泄漏。 如果超过了内存限制,则程序将通过抛出错误(即“ OutOfM

  • 问题内容: 我使用Informix遇到了一个奇怪的问题(具体来说,我使用的是IBM.Data.Informix命名空间,即4.10 Client SDK)。我正在使用ODBC连接到IBM Informix数据库,并且遇到内存泄漏问题。该文档相当稀疏,并且我只能使用当前安装的驱动程序/ SDK。这是我用于数据库上下文的代码: } 我已尝试处置并关闭所有可以的连接,但这似乎无济于事。我是否缺少某些东西

  • 我们有一个基于go-socket.io(socket.ioGo语言实现)和大猩猩网络插座的网络插座服务,但是似乎有内存泄漏问题。即使我使用调试,HeapAlloc也总是在增加。FreeOSMemroy强制释放内存。 服务很简单。它将使用jwt令牌对传入请求进行身份验证,如果身份验证成功,则将创建一个go套接字。io conn基于gorilla websocket conn。但现在似乎是net/te