问题标签 [resource-leak]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2508 浏览

java - JDK ClassLoader.getResourceAsStream 坏了吗?(未关闭的资源)

我将尝试证明ClassLoader.getResourceAsStream()打开两个InputStreams,一个都不关闭,只返回一个给客户。我的逻辑正确吗?JDK 源码选自 jdk1.8.0_25

我在间隔(原始问题)中使用 Spring ClassPathResource 遇到了未关闭的资源问题,该问题ClassLoader.getResourceAsStream用于获取InputStream属性文件。

经过调查,我发现classLoader.getResourceAsStream正在URL通过URL url = getResource(name);然后它正在打开该流,但URL url = getResource(name)已经打开了该流。JDK源码ClassLoader

如果我们close()InputStream这种方式提供,我们将仅关闭由url.openStream(). JDK源码:

我假设,问题是,JDK 静默地打开一个流,URL url = getResource(name)只是为了获取 URL 对象,该对象进一步用于创建**第二个(返回给客户端)流**。看看这个方法的来源:

而现在,在我们转换为忘记打开的流getBootstrapResource(name)的那一刻ResourceURL Resource

为什么ucp.getResource(name);要开放资源?让我们看看那个方法:this.getResource(var1, true);,它委托给:

为什么Resource var5 = var3.getResource(var1, var2);要打开流?进一步看:

我们可以看到openConnection()and getInputStream(),它们没有关闭,并且通过所有返回的调用回退,Resource我们最终只使用getURL()包装的方法Resource而不关闭它InputStream只是使用该URL对象打开另一个 jetInputStream并将其返回给客户端(客户端可以关闭coruse,但我们以第一个未关闭的流结束)。

那么,ClassLaoder.getResourceAsStream 是否因资源泄漏而中断?

实用方面:我getResourceAsStreamtry-with-resources块中使用,并且在生产中仍然存在未关闭的资源问题,每 30 秒以这种方式加载文件名。此外,所有资源在垃圾回收时都关闭,这与方法中的文件流close()一致finalize()

0 投票
1 回答
607 浏览

c# - 处理 Icon 和 Bitmap 有区别吗?

我在我的应用程序中调试资源泄漏并创建了一个测试应用程序来测试 GDI 对象泄漏。在 OnPaint 中,我创建新图标和新位图,但不处理它们。之后,我在每个案例的任务管理器中检查 GDi 对象的增加。但是,如果我继续重新绘制应用程序的主窗口,图标的 GDI 对象数量会增加,但位图没有变化。图标没有像位图一样被清理,有什么特别的原因吗?

测试结果:

  1. 没有图标和位图 - 30 个 GDI 对象
  2. 使用位图 - 31 GDI 对象,数字不会改变。
  3. 使用图标 - 31,然后如果您重新绘制窗口,数字会增加。
0 投票
2 回答
152 浏览

java - 从 Java 调用时如何在 Ant 脚本中查找资源泄漏

[注意:我发现资源泄漏了(请参阅下面的答案),但我仍然很好奇为什么命令行 ant 确实终止但 in-java ant 没有]

我正在从我的 Java 程序中调用一个复杂的 ant 目标。它运行没有错误。但最终程序并没有终止。我通过 Maven 执行从 NetBeans 调用程序。

如果我从命令行调用 ant 目标,它会终止。如果我System.exit(0);在程序结束时写,它就会终止。

所以,我假设要么我错过了对 ant 库的一些调用,告诉它关闭所有流等,要么我的 ant 脚本中有资源泄漏。我认为这是一个资源泄漏,因为jstack报告了一个开放的流(见下文) - 我怎么能找出那里有什么开放的?

这是我给蚂蚁的电话:

我试着打电话project.fireBuildFinished(null);,但这并没有改变任何事情。

如果我注释掉蚂蚁部分,程序就会终止。如果我离开记录器,它仍然不会终止。

我将放弃 ant 脚本本身,因为它分布在许多文件中并且非常复杂。我的目标是学习如何自己找到资源泄漏,而不是仅仅解决这个问题。

日志文件也不包含任何错误(以“BUILD SUCCESSFUL”结尾)。

当它停止时我调用jstack了这个过程,结果如下:

0 投票
0 回答
131 浏览

javascript - 使用 jquery 更改对象的 css 属性会导致疯狂的内存增加

我使用 chrome 开发工具测试了内存泄漏,垃圾收集器正在完成它的工作,所以没有循环引用。这是一个奇怪的问题,我不知道该怎么办了。一个简单的 jQuery 调用$(e).css("top", 'any value other than current');将导致浏览器为选项卡分配 ~5-200mb 内存!最终它在达到大约 700mb 后崩溃。这发生在我在不同页面上测试过的所有元素上。在尝试 ie 时,它​​最终也会崩溃,尽管内存使用情况并没有像 chrome 那样反映在任务管理器中。任何想法可能是什么问题?我该如何进一步分析它。

0 投票
1 回答
8613 浏览

java - 资源泄漏:“rset”未在此位置关闭

所以我正在做一个项目,我不确定如何处理这个错误或者可以做些什么来修复它。我已经尝试了我能想到的一切,也许其他人对如何解决它有一些意见。它是用java编码的,用于游戏。错误是资源泄漏:“rset”未在此位置关闭。这是它单挑的这条线。

希望有人对如何修复此错误有一些意见,我应该抑制警告,它会导致内存泄漏还是影响程序的性能?

0 投票
4 回答
402 浏览

java - Java 资源泄漏

我的应用程序中有这个代码片段,我很确定我已经关闭了所有流。

但是,令人惊讶的是,我不断得到:在附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅 java.io.Closeable。java.lang.Throwable:未调用显式终止方法“关闭”

任何指针都会非常有用。

0 投票
1 回答
6796 浏览

java - 资源泄漏(资源超出范围)

嗨,这里有几行代码。

现在它给出以下警告:

leaked_resource:超出范围的变量泄漏了它所引用的资源”

谁能解释一下?

这就是我修复它的方法:

0 投票
3 回答
181 浏览

c++ - 防止 dll 中的 GDI 泄漏

有一个在 dll 中使用的图形库,加载到进程中。似乎库泄漏(在加载/卸载期间,进程资源管理器属性对话框中的 GDI 句柄计数在整个进程中不断增长)。

有没有办法将 dll 创建的所有 GDI 句柄存储在一个进程中,以便在卸载 dll 后将它们全部删除?说,挂钩 CreateBitmap() 等等?但是如何判断资源是不是我们的dll创建的,而不是进程本身呢?

问候,

0 投票
1 回答
1208 浏览

java - 课堂未关闭时强制警告

java.util.Scanner当我使用or之类的 IO 类时java.io.BufferedReader,Eclipse 会显示一个警告Resource leak: 'suchAndSuch' is never closed。如何让 Eclipse 在未关闭时为我自己的类显示此警告?

我想知道的是是否有一个接口或我需要实现的东西来使我的类被视为 IO 类,以便它独立于任何一个 IDE,例如,javac当资源不存在时,命令行也会显示警告t 关闭。

0 投票
3 回答
263 浏览

shell - shell:清理由于共享 stdout/stderr 而挂起的泄露的后台进程

我需要在临时容器/VM 中的(远程)shell 上为测试执行引擎运行基本上任意命令。有时这些泄漏后台进程会导致整个命令挂起。这可以归结为这个简单的命令:

在这里,backgroundedsleep 30扮演了泄露进程的角色(实际上将类似于dbus-daemon),而 echo 是我想要运行的实际内容。此处应将其sleep 30 & echo payload视为原子不透明示例命令。

上面的命令很好,并立即返回,因为 shell 和 sleep 的 stdout/stderr 都是 PTY。但是,当将命令的输出捕获到管道/文件时(毕竟,测试运行程序希望将所有内容保存到日志中),整个命令会挂起:

现在,这可以通过一些相当可笑的复杂 shell 魔法来解决,它确定 stdout/err 的 FD /proc/$$/fd/{1,2},迭代ls /proc/[0-9]*/fd/*并杀死每个也具有相同 stdout/stderr 的进程。但这涉及到大量脆弱的 shell 代码和昂贵的 shell 字符串比较。

有没有办法以更优雅、更简单的方式清理这些泄露的后台进程?setsid没有帮助:

请注意,进程组/会话并彻底杀死它们是不够的,因为泄漏的进程(如 dbus-daemon)通常会自行设置。

PS 我只能在这些环境中假设 POSIX shell 或 bash;没有 Python、Perl 等。

先感谢您!