问题标签 [garbage-collection]

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 投票
4 回答
698 浏览

programming-languages - 为什么尾调用优化需要垃圾收集?

为什么尾调用优化需要垃圾收集?是不是因为如果你在一个函数中分配内存,然后你想对它进行尾调用,就没有办法进行尾调用并重新获得该内存?(因此必须保存堆栈,以便在尾调用之后可以回收内存。)

0 投票
2 回答
1907 浏览

asp.net - 我是否需要取消订阅(手动订阅)asp.net 中的事件?

关于订阅/取消订阅事件的最佳实践规则是否适用于 asp.net?

我知道这可能看起来像一个愚蠢的问题,但是当我想到它时,我从未真正见过人们首先订阅页面上的事件然后稍后在 Web 请求中取消订阅的任何代码。

示例 1:在页面上,在 Page_Load 方法中,我订阅了 ListView 上的更新事件。我是否应该稍后取消订阅该事件,例如在 OnPreRenderComplete 方法中?

示例 2:在被动视图模式中,视图(页面控件/用户控件)将在需要演示者执行任何操作时引发事件。所以presenter需要订阅视图上的事件,但是是否也需要再次取消订阅事件呢?

最好的问候,埃吉尔。

0 投票
3 回答
744 浏览

java - 垃圾收集对象在内部 Map 中跟踪自己的实例

在我的类的构造函数中,我将当前对象(this)连同它的键(在构造函数中作为参数输入的字符串)映射到静态 LinkedHashMap 中,这样我就可以在以后可能需要的任何地方通过字符串引用对象.

这是代码(如果有帮助):

问题?当我使用完此类的实例时,它们不会被垃圾收集。

我只是好奇是否有办法让这个类的实例在我用完它们后自行清理,而不必每次都手动调用 Remove() 方法或其他东西(当我在内部 LinkedHashMap 中删除它的引用时) '不再使用它们,我的意思是)。

0 投票
4 回答
2988 浏览

c# - .NET 中是否存在弱引用?

我想在我的应用程序中保留某类对象的列表。但我仍然希望对象被垃圾收集。您可以在 .NET 中创建弱引用吗?

以供参考:

来自 MSDN 的回答:

要与对象建立弱引用,请使用要跟踪的对象的实例创建 WeakReference。然后将 Target 属性设置为该对象并将该对象设置为 null。有关代码示例,请参阅类库中的 WeakReference。

0 投票
4 回答
3898 浏览

objective-c - 为 10.5+ 编写代码时应该使用 Objective-C 垃圾收集吗?

在 OS X 10.5+ 环境中编写相当典型的 Mac 代码时,使用垃圾收集有哪些缺点?

到目前为止,我编写的所有其他内容要么与 10.4 兼容,要么在 iPhone 上,所以我对保留/发布已经相当满意,但现在我正在处理一个只有 10.5 的更大项目,我想知道是否有继续使用 Objective-C 2.0 垃圾收集器有什么缺点吗?

你们有什么感想?

0 投票
4 回答
1103 浏览

c# - CLR 什么时候说一个对象有一个终结器?

我知道在 C# 中,如果您编写~MyClass(),这基本上会转换为override System.Object.Finalize(). 因此,无论您是否编写析构函数,CLR 中的每种类型都将有一个Finalize()方法(System.Object至少)。

1] 那么,这是否意味着,默认情况下,每个对象都有一个终结器?

2] CLR 决定一个对象应该进入终结队列的依据是什么?

我问这个,因为,我有一个类,说ManagedResourceHolder已实现IDisposable,但没有调用GC.SuppressFinalize(this)它的IDisposable.Dispose()方法。该类没有任何非托管资源,并且不需要该~ManagedResourceHolder()方法,这反过来意味着不需要 GC.SuppressFinalize(this)调用,因为没有终结器。

3] 在上述情况下,实现 IDisposable 时是否总是需要提供终结器?(即使在一个没有非托管资源的类上)

FxCop 规则CA1816违反了这一点,当我在 MSDN 上的 CA 论坛上提问时,我得到的回复让我感到困惑

谢谢。

0 投票
2 回答
1109 浏览

objective-c - 使用垃圾收集时新创建的 Cocoa 应用程序中的内存泄漏?

我决定将 GC 用于我最新的 Cocoa 项目的内存管理,我发现了一些有趣的东西——如果我在 Xcode 中创建一个全新的 Cocoa 应用程序项目,将 GC 设置为支持或必需(我都尝试过),构建并运行它泄漏,它显示内存泄漏!

主要是 NSCFData、GeneralBlock、CGEvent、CFDictionary、CGSRegion 等类型的对象的大量微小泄漏。

重现步骤:

  1. 文件->新建项目->Cocoa应用
  2. 项目->编辑项目设置->GC 必需(或支持,任一)
  3. 构建->构建
  4. 运行->使用性能工具运行->泄漏
  5. 等待泄漏检测触发(我将其设置为 10 秒,默认为 30)

大约 80% 的时间我会泄漏大约 2-20 Kb 的上述各种对象。

其他人有同样的行为吗?


编辑:我通过重命名 InputManagers 文件夹测试了以下情况(此时日志消息消失了,所以它们肯定不再被加载)并且仍然出现内存泄漏。因此,这似乎与它无关。我把文字留在那里,所以阿什利克拉克的回答仍然有意义。

我知道的唯一奇怪的情况是,每当我运行启用了 GC 的应用程序时,我都会在控制台中收到以下消息:

我猜这与这两个插件试图加载到每个启动的程序中有关,而不仅仅是 Safari(它们是它们的插件)。我不确定这是否与此有关,但这似乎绝对是一种可能性。我无法方便地使用带有开发工具的干净而不是 OS X 10.5 来测试在没有 SAFT 或 Inquisitor 的原始安装上是否会发生同样的事情。

0 投票
4 回答
11111 浏览

c# - 使用匿名委托进行事件处理时的垃圾收集

更新

我已将此处的各种答案组合成一个新问题的“明确”答案。

原始问题

在我的代码中,我有一个事件发布者,它存在于应用程序的整个生命周期(这里简化为基本要素):

因为这个发布者可以在任何地方使用,我很高兴自己创建了这个小助手类,以避免在所有订阅者中重写处理代码:

它工作得很好,直到我们开始在较小的机器上使用它,当我开始偶尔:

事实证明,代码中有一个地方是订阅者控件被动态创建、添加和从表单中删除的。鉴于我对垃圾收集等的深入了解(即直到昨天还没有),我从来没有想过要在我身后进行清理,因为在绝大多数情况下,订阅者也会在应用程序的整个生命周期内都存在。

我已经用Dustin Campbell 的 WeakEventHandler摆弄了一段时间,但它不适用于匿名代表(无论如何都不适合我)。

反正有这个问题吗?我真的很想避免在整个商店复制粘贴样板代码。

(哦,别问我为什么我们一直在创建和销毁控件,这不是我的设计决定......)

(PS:这是一个winforms应用程序,但我们已经升级到VS2008和.Net 3.5,我应该考虑使用弱事件模式吗?)

(PPS:来自 Rory 的好答案,但如果有人能想出一个与 WeakEventHandler 等效的方法,这样我就不必记住显式 UnLink/Dispose,那会很酷......)

编辑我必须承认我通过“回收”有问题的控件来解决这个问题。然而,解决方法又回来困扰我,因为我使用的“钥匙”显然不是唯一的(呜咽)。我刚刚在这里发现了其他链接(尝试过这个 - 似乎有点太弱了- 即使目标仍然存在,GC也会清除代表,下面的 s,oɔɯǝɹ 答案也有同样的问题),这里(强制你修改发布者,并且不't 真正与匿名代表一起工作)和这里(引用为不完整的达斯汀坎贝尔)。

我突然想到,我正在寻找的东西在语义上可能是不可能的——闭包的设计目的是“即使在我离开后也能闲逛”。

我找到了另一种解决方法,所以我会坚持下去,等待众神的声音

0 投票
2 回答
2339 浏览

c# - 一段时间后,GC 包含大量固定对象

在不断实例化一个 com-wrapper 然后让 GC 收集它(不是强制)时,我有一个奇怪的现象。

我正在 WinCE x86 上的 .net cf 上对此进行测试。使用 .net Compact 框架远程监控器监控性能。使用平台构建器工具包中的 Windows CE 远程性能监视器跟踪本机内存。

在前 1000 个创建的实例中, perfmon 中的每个计数器似乎都正常:

  • GC 堆上升和下降,但平均值保持不变
  • 固定对象为 0
  • 本机内存保持相同的平均值
  • ...

但是,在这 1000 个(大约)之后,固定对象计数器会上升,并且永远不会再下降。但是,内存使用量保持不变。

我不知道从这些信息中得出什么结论...这是计数器中的错误,这是我的软件中的错误吗?

[编辑]

我确实注意到,一旦 GC 稳定后使用的总字节数与压缩器计数器未移动的对象一样,固定对象计数器开始上升。

计数器图形 http://files.stormenet.be/gc_pinnedobj.jpg

[/编辑]

这是涉及的代码:

Image 对象包含一个 AlphaImage:

0 投票
5 回答
1203 浏览

asp.net - 诊断“% Time in Garbage Collection”问题

我有一个 ASP.NET 2.0 应用程序,在生产级服务器(双四核,4g)上进行负载测试时,它在垃圾收集上花费了超过 40% 的时间。我一直试图找出问题所在,但它是一个庞大而复杂的代码库,导致进展缓慢。没有 GC.Collect() 调用。在尝试隔离此类问题时,哪些工具、技术等很有帮助?