问题标签 [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.
.net - 使用 GC.Collect() 有什么问题?
尽管我确实理解使用此功能的严重影响(或者至少我是这么认为的),但我不明白为什么它会成为受人尊敬的程序员永远不会使用的东西之一,即使是那些甚至不知道的人它是干什么用的。
假设我正在开发一个应用程序,其中内存使用量根据用户的操作而变化很大。应用程序生命周期可以分为两个主要阶段:编辑和实时处理。在编辑阶段,假设创建了数十亿甚至数万亿个对象;其中有些很小,有些没有,有些可能有终结器,有些可能没有,假设它们的生命周期从几毫秒到几小时不等。接下来,用户决定切换到实时阶段。在这一点上,假设性能起着根本性的作用,并且程序流程中最轻微的改变都可能带来灾难性的后果。然后通过使用对象池等将对象创建减少到最低限度,但随后,GC 意外地插入并将其全部丢弃,并且有人死了。
问题:在这种情况下,在进入第二阶段之前调用 GC.Collect() 不是明智的吗?
毕竟,这两个阶段永远不会在时间上相互重叠,GC 可能收集的所有优化和统计信息在这里用处不大......
注意:正如你们中的一些人所指出的,.NET 可能不是这样的应用程序的最佳平台,但这超出了这个问题的范围。目的是澄清 GC.Collect() 调用是否可以改善应用程序的整体行为/性能。我们都同意你会做这样的事情的情况非常罕见,但话又说回来,GC 试图猜测并且大部分时间都做得很好,但它仍然是猜测。
谢谢。
c# - 终结器在其对象仍在使用时启动
摘要: C#/.NET 应该是垃圾收集。C# 有一个析构函数,用于清理资源。当对象 A 在我尝试克隆其变量成员之一的同一行被垃圾收集时会发生什么?显然,在多处理器上,有时垃圾收集器会获胜......
问题
今天,在 C# 培训课程中,老师向我们展示了一些代码,这些代码只有在多处理器上运行时才会包含错误。
我会总结说,有时,编译器或 JIT 在从其调用的方法返回之前调用 C# 类对象的终结器会搞砸。
Visual C++ 2005 文档中给出的完整代码将作为“答案”发布,以避免提出非常大的问题,但基本内容如下:
下面的类有一个“哈希”属性,它将返回一个内部数组的克隆副本。在构造函数中,数组的第一项值为 2。在析构函数中,它的值设置为零。
关键是:如果您尝试获取“示例”的“哈希”属性,您将获得数组的一个干净副本,其第一项仍然是 2,因为正在使用该对象(因此,不是垃圾收集/完成):
但没有什么比这更简单了......使用这个类的代码在一个线程中运行,当然,对于测试,该应用程序是高度多线程的:
DoWork 静态方法是发生问题的代码:
显然,每执行 1,000,000 次 DoWork,垃圾收集器就会施展魔法,并尝试回收“ex”,因为它不再在函数的剩余代码中被引用,而这一次,它比“Hash”更快获取方法。所以我们最终得到的是一个零字节数组的克隆,而不是正确的(第一项在 2)。
我的猜测是代码的内联,它基本上将 DoWork 函数中标记为 [1] 的行替换为以下内容:
如果我们假设 Hash2 是一个简单的访问器,编码如下:
所以,问题是:这是否应该在 C#/.NET 中以这种方式工作,或者这是否可以被视为 JIT 编译器的错误?
编辑
有关解释,请参阅 Chris Brumme 和 Chris Lyons 的博客。
http://blogs.msdn.com/cbrumme/archive/2003/04/19/51365.aspx
http://blogs.msdn.com/clyon/archive/2004/09/21/232445.aspx
每个人的答案都很有趣,但我无法选择一个比另一个更好的答案。所以我给了你们一个+1...
对不起
:-)
编辑 2
尽管在相同条件下使用相同的代码(多个相同的可执行文件同时运行、发布模式等),但我无法在 Linux/Ubuntu/Mono 上重现该问题
java - Lambda Probe 死了吗?
有谁知道从哪里获得LambdaProbe的源代码?
或者,有谁知道该项目是否可以移动到社区存储库?
除了该工具一年多没有更新外,LambdaProbe 网站自 2008 年 9 月下旬以来一直处于关闭状态。
背景:Lambda Probe 是一个有用的工具,用于查看正在运行的 tomcat 服务器上的统计信息。它曾经可以在http://www.lambdaprobe.org找到。
c++ - 为什么 C++ 没有垃圾收集器?
我之所以问这个问题,首先是因为垃圾收集的优点。我问这个的主要原因是我知道 Bjarne Stroustrup 说过 C++ 将在某个时间点有一个垃圾收集器。
说了这么多,怎么还没加呢?已经有一些用于 C++ 的垃圾收集器。这只是那些“说起来容易做起来难”的事情之一吗?还是有其他原因没有添加(并且不会在 C++11 中添加)?
交叉链接:
澄清一下,我理解 C++ 在首次创建时没有垃圾收集器的原因。我想知道为什么无法添加收集器。
c# - 追踪仅在一个客户的盒子上可见的内存泄漏 (C#) 的最佳方法
追踪仅在一个客户的测试/发布盒上发现的内存泄漏的最佳方法是什么?
c# - 我什么时候应该使用 GC.SuppressFinalize()?
在 .NET 中,我应该在什么情况下使用GC.SuppressFinalize()
?
使用这种方法能给我带来什么好处?
php - 我可以信任调用 PHP __destruct() 方法吗?
在 PHP5 中,是否保证为每个对象实例调用 __destruct() 方法?程序中的异常可以防止这种情况发生吗?
c# - C# 中的固定语句
在我们的一个项目中,我们有与以下类似的代码。谁能解释(用简单的英语)为什么这里需要固定语句?
java - 我怎样才能弄清楚是什么保留了未释放的对象?
我们的一个程序有时会OutOfMemory
在一个用户的机器上出错,但在我测试它时当然不会。我只是用 JProfiler 运行它(在 10 天评估许可证上,因为我以前从未使用过它),并过滤我们的代码前缀,总大小和实例数的最大块是特定简单类的 8000+ 个实例.
我单击了 JProfiler 上的“垃圾收集”按钮,我们其他类的大多数实例都消失了,但这些特定的实例没有。我再次运行测试,仍然在同一个实例中,它创建了 4000 多个该类的实例,但是当我单击“垃圾收集”时,这些实例消失了,留下了 8000 多个原始实例。
这些实例确实在各个阶段陷入了各种集合中。我假设它们不是垃圾收集的事实一定意味着某些东西正在持有对其中一个集合的引用,因此它持有对对象的引用。
有什么建议可以让我弄清楚参考资料是什么?我正在寻找有关在代码中寻找什么的建议,以及在 JProfiler 中找到它的方法(如果有)。