Questions tagged «garbage-collection»

10
什么时候强制垃圾回收是个好主意?
因此,我正在阅读一个有关强制C#垃圾收集器在几乎每个答案都相同的地方运行的问题:您可以做到,但您不应该这样做-除了一些非常罕见的情况。可悲的是,那里没有人详细说明这种情况。 您能告诉我在哪种情况下强制垃圾回收实际上是一个好主意吗? 我不是在询问C#的特定情况,而是询问所有具有垃圾收集器的编程语言。我知道您不能在所有语言(例如Java)上强制使用GC,但让我们假设可以。

6
Java中的堆栈和堆内存
据我了解,在Java中,堆栈内存保存了原语和方法调用,而堆内存则用于存储对象。 假设我有一堂课 class A { int a ; String b; //getters and setters } a类中的基元A将存储在哪里? 为什么堆内存根本存在?为什么我们不能将所有内容都存储在堆栈中? 当对象被垃圾回收时,与对象相关联的堆栈是否被破坏?

6
垃圾回收如何以本地编译的语言工作?
浏览了堆栈溢出的几个答案之后,很明显,一些本机编译的语言具有垃圾回收功能。但是我不清楚这将如何工作。 我了解垃圾收集如何与解释语言一起工作。垃圾收集器将仅与解释器一起运行,并从程序的内存中删除未使用和无法访问的对象。他们俩一起跑。 但是,如何使用编译语言呢?我的理解是,一旦编译器将源代码编译为目标代码(特别是本机代码),就完成了。它的工作完成了。那么,编译后的程序又如何被垃圾回收呢? 在执行程序删除“垃圾”对象时,编译器是否以某种方式与CPU一起工作?还是编译器在编译程序的可执行文件中包括一些最小的垃圾回收器。 我相信我的后一种说法将比前一种更具有效性,这是由于从Stack Overflow的答案中摘录的: 一种这样的编程语言是埃菲尔。大多数Eiffel编译器出于可移植性原因而生成C代码。该C代码用于通过标准C编译器生成机器代码。埃菲尔实现为该已编译的代码提供GC(有时甚至是精确的GC),并且不需要VM。特别是,VisualEiffel编译器直接在完全GC支持下生成了本机x86机器代码。 最后一条语句似乎暗示编译器在最终的可执行文件中包含一些程序,该程序在运行时充当垃圾回收器。 在页面d语言的关于垃圾收集的网站这是本地编译并具有可选的垃圾收集器- -似乎也暗示了一些后台程序运行沿着原来的可执行程序来实现垃圾回收。 D是一种支持垃圾回收的系统编程语言。通常,没有必要显式释放内存。只需根据需要进行分配,垃圾收集器就会定期将所有未使用的内存返回到可用内存池。 如果方法上面提到的被使用,究竟会工作的呢?编译器是否存储一些垃圾回收程序的副本并将其粘贴到它生成的每个可执行文件中? 还是我的思维有缺陷?如果是这样,使用什么方法来实现编译语言的垃圾回收,它们将如何工作?

11
为什么在不再引用Java对象后不立即删除它们?
在Java中,只要对象不再具有任何引用,就可以删除它,但是JVM决定何时实际删除该对象。要使用Objective-C术语,所有Java参考本质上都是“强”的。但是,在Objective-C中,如果对象不再具有任何强引用,则该对象将被立即删除。为什么在Java中不是这种情况?

11
如果存在智能指针,为什么要进行垃圾回收
如今,垃圾收集了许多语言。第三方甚至可以使用C ++。但是C ++具有RAII和智能指针。那么使用垃圾回收有什么意义呢?它在做额外的事情吗? 在其他语言(例如C#)中,如果所有引用都被视为智能指针(不考虑RAII),那么按照规范和实现,是否还会需要垃圾收集器?如果否,那为什么不是呢?

16
为什么C和C ++之类的语言没有Java的垃圾回收?[关闭]
好吧,我知道在C ++中有诸如malloc / free和在C ++中用于内存管理的new / using-destructor之类的东西,但是我想知道为什么这些语言没有“新更新”,使用户能够是否可以选择手动管理内存,或让系统自动进行内存管理(垃圾回收)? 有点新奇的问题,但仅在CS中使用了大约一年。

6
何时在.Net中使用弱引用?
我个人没有遇到过需要在.Net中使用WeakReference类型的情况,但是普遍的看法似乎是应该在缓存中使用它。乔恩·哈罗普博士给了反对缓存使用在WeakReferences在他的一个很好的案例回答到这个问题。 我也经常听到AS3开发人员谈论使用弱引用来节省内存占用,但是根据我的交谈,似乎增加了复杂性,而不一定实现预期的目标,并且运行时行为是不可预测的。如此之多,以至于许多人只是放弃了,而是更加谨慎地管理内存使用/优化其代码以减少内存占用(或权衡更多的CPU周期和较小的内存占用)。 乔恩·哈罗普(Jon Harrop)博士在回答中也指出.NET弱引用不是软的,并且在gen0上有激进的弱引用集合。根据MSDN,较长的弱引用使您有可能重新创建对象but the state of the object remains unpredictable.! 考虑到这些特征,我想不出弱引用有用的情况,也许有人可以启发我?

8
C ++中的垃圾会发生什么?
Java有一个自动GC,它偶尔会停止世界,但会处理堆上的垃圾。现在C / C ++应用程序没有这些STW冻结,它们的内存使用也不会无限增长。如何实现这种行为?如何处理死物?

5
为什么引用计数智能指针如此受欢迎?
如我所见,智能指针已在许多实际的C ++项目中广泛使用。 尽管某种智能指针显然有利于支持RAII和所有权转移,但也存在一种趋势,默认情况下使用共享指针作为“垃圾收集”方式,因此程序员不必考虑太多分配。 为什么共享指针比集成Boehm GC这样的适当垃圾收集器更受欢迎?(或者您是否完全同意它们比实际的GC更受欢迎?) 我知道常规GC相对于引用计数有两个优点: 常规的GC算法在参考循环方面没有问题。 参考计数通常比适当的GC 慢。 使用引用计数智能指针的原因是什么?


8
基于作用域的内存管理的缺点
我真的很喜欢基于作用域的内存管理(SBMM)或RAII,因为它在C ++社区中更为常见(令人困惑?)。据我所知,除C ++(和C)外,当今没有其他主流语言使SBMM / RAII成为主要的内存管理机制,相反,他们更喜欢使用垃圾回收(GC)。 我觉得这很令人困惑,因为 SBMM使程序更具确定性(您可以确切地说出销毁对象的时间); 在使用GC的语言中,您通常必须执行手动资源管理(例如,参见关闭Java中的文件),这在一定程度上违背了GC的目的,并且也容易出错。 堆内存还可以(非常优雅地称为imo)是作用域绑定的(请参见std::shared_ptrC ++)。 为什么SBMM没有得到更广泛的使用?它有什么缺点?

8
重写Object.finalize()真的不好吗?
反对重写的两个主要论点Object.finalize()是: 您不必决定何时调用它。 它可能根本不会被调用。 如果我正确理解了这一点,我认为这些理由不足以令人讨厌Object.finalize()。 由VM实施和GC决定何时分配对象的正确时间,而不是开发人员。为什么决定何时Object.finalize()打电话很重要? 通常,如果我错了,请纠正我,唯一的一次Object.finalize()调用是在GC有机会运行之前终止应用程序的时间。但是,无论如何,当应用程序的进程终止时,对象都会被释放。因此Object.finalize()没有被调用,因为它不需要被调用。开发人员为什么要关心? 每次我使用必须手动关闭的对象(例如文件句柄和连接)时,我都会感到非常沮丧。我必须不断检查对象是否具有的实现close(),并且我肯定在过去的某些时候错过了对它的一些调用。为什么不把它放到VM和GC中,而是通过将close()实现放入其中来处置这些对象,这将变得更加简单,安全Object.finalize()呢?



8
为什么垃圾收集仅清除堆?
基本上,到目前为止,我已经了解到垃圾回收将永远擦除当前未指向的任何数据结构。但这仅检查堆是否存在这种情况。 为什么不同时检查数据部分(全局变量,常量等)或堆栈呢?关于堆,这是我们唯一要进行垃圾收集的东西吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.