问题标签 [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.
c++ - 如何尝试垃圾收集?
我对垃圾收集的工作原理很感兴趣。我已经阅读了一些工作,如标记和清除、停止和复制、分代 GC 等......我想尝试实现其中的一些并比较它们的行为。什么是开始尝试我自己的好方法?理想情况下是 C、Java 或 Python 中的东西(尽管最后两个本身是垃圾收集的,所以似乎很难使用它们......)
apache-flex - 创建对对象的弱引用
是否可以在 Actionscript 3 中创建对对象的弱引用,以便对其进行垃圾收集。
我正在创建一些类以使调试更容易,因此如果仅在此处引用它们,我不希望对象在内存中徘徊(当然我不想用回调填充代码以删除对象)
c# - 使用 StringBuilder Remove 方法是否比在循环中创建新的 StringBuilder 更节省内存?
在 C# 中哪个内存效率更高:选项 #1 或选项 #2?
java - 在最近的 JVM 中,不可见的引用仍然是一个问题吗?
我正在阅读Java 平台性能(遗憾的是,自从我最初提出这个问题以来,该链接似乎已经从互联网上消失了),第 A.3.3 节让我担心。
我一直在假设退出范围的变量将不再被视为 GC 根,但本文似乎与此相矛盾。
最近的 JVM,尤其是 Sun 的 1.6.0_07 版本,是否还有这个限制?如果是这样,那么我有很多代码要分析......
我问这个问题是因为这篇论文是 1999 年的——有时情况会发生变化,尤其是在 GC 领域。
由于该论文不再可用,我想解释一下这个问题。该论文暗示在方法内定义的变量将被视为 GC 根,直到方法退出,而不是直到代码块结束。因此,必须将变量设置为 null 以允许对引用的对象进行垃圾收集。
这意味着在 main() 方法(或包含无限循环的类似方法)的条件块中定义的局部变量将导致一次性内存泄漏,除非您在变量退出范围之前将其置空。
所选答案中的代码很好地说明了这个问题。在文档中引用的 JVM 版本上,当 foo 对象在 try 块结束时超出范围时,无法进行垃圾回收。相反,JVM 将保持打开引用直到 main() 方法结束,即使任何东西都不可能使用该引用。
这似乎是一个想法的起源,即使变量引用为空将有助于垃圾收集器,即使该变量即将退出范围。
garbage-collection - 具有并发垃圾收集器的功能语言?
Microsoft 的新 F# 编程语言提供了函数式编程(一流的词法闭包和尾调用)与高效的并发垃圾收集器的强大组合,可以轻松利用多核。
OCaml、Haskell、Erlang 以及我所知道的所有免费 Lisp 和 Scheme 实现都没有并发 GC。Scala 和 Clojure 有一个并发 GC,但没有尾调用。
因此,似乎没有结合这些功能的开源编程语言。那是对的吗?
flash - 垃圾收集器 Flash 播放器
有没有办法强制闪存垃圾收集器清理释放的内存?我已经看到闪存清理未引用的内存需要很长时间......
multithreading - 我可以阻止垃圾收集器停止我的一些线程吗?
是否可以在 Compact Framework 应用程序中阻止垃圾收集器无条件地停止至少一个线程,或者至少在代码的某些部分阻止 GC 收集?
我认为它必须处理设置实时优先级,但我发现很多建议不要这样做。
c++ - 使用 Boehm GC 时 C++ 内存泄漏的原因
这段代码对我造成了内存泄漏,我不知道为什么。
[编辑]此处包含的代码有问题:
AlInt 继承自 AlObj,而 AlObj 又继承自 gc。当我注释掉 setup() 的内容时,我没有内存泄漏,这让我相信问题在于地图没有清理,但是我使用的是 gc 分配器,所以我不确定接下来看哪里。想法?
c# - 事件处理程序会阻止垃圾收集的发生吗?
如果我有以下代码:
pClass 会被垃圾回收吗?或者它是否会在事件发生时仍然触发它的事件?为了允许垃圾收集,我需要执行以下操作吗?
.net - 非托管代码使用的 .NET 组件的内存管理
new
在非托管世界中工作时,如果我们在堆上分配了内存(例如,在 C++ 中使用关键字),我们必须确保自己清理干净;我们还必须确保我们以后使用它AddRef
创建的 COM 组件;也许是这样的:CreateInstance
Release
显然我们可以使用智能指针和其他类似的东西(在 C++ 中),但除此之外......
AddRef/Release
对于从 COM 组件中获取的对象(如上例中的 m_anotherObj),我们是否也必须这样做?
更令人困惑的是,如果这个特定组件实际上是一个 .NET 组件,它通过 COM 接口暴露给非托管代码,会发生什么?垃圾收集器是否知道清理东西,还是必须在非托管世界中手动完成?