当前位置: 首页 > 知识库问答 >
问题:

对象何时符合垃圾回收机制?[重复]

施子民
2023-03-14

在约瑟夫·阿尔巴哈里(Joseph Albahari)的《C#5.0简言之》一书中,我发现了这一点

然而,根据加州大学伯克利分校的这堂课,只要堆栈上存在对该对象的引用,它就不会被垃圾收集。我的理解是,在方法返回之前,变量将保留在堆栈上。这意味着它引用的任何对象在方法返回之前都是活动的。

这是书中的错误还是java和。net垃圾收集工作有什么不同?

共有3个答案

梁勇
2023-03-14

我的理解是,在方法返回之前,变量将保留在堆栈上。这意味着它引用的任何对象在方法返回之前都是活动的。

JIT可以在对象引用(“变量”)最后一次使用后随时删除它,因此这不一定是真的。

只要堆栈上存在对该对象的引用,就不会对其进行垃圾收集

这是真的——但是当这个变量不再“存在于堆栈上”时,JIT可能会以不一定匹配您的代码的方式改变。

在C#5中,这也会让人非常困惑,因为async方法的重写方式会使变量在某些场景中停留的时间比预期的要长。

这就是说,如果您需要保证某个对象在某一点上是合格的,那么将引用该对象的变量显式设置为null将允许您控制该对象何时显式合格。

梁丘权
2023-03-14

这本书是正确的。

在。NET中,垃圾回收器具有变量在代码中使用的位置的信息,一旦未使用,对象就有资格使用垃圾回收机制。

(但是,如果在附加了调试器的情况下运行代码,垃圾收集器会更改行为。它会在变量的整个范围内保留对象,而不仅仅是在使用变量的位置,以便在调试器中调查对象。)

锺伟志
2023-03-14

然而,根据加州大学伯克利分校的这个讲座,只要堆栈上存在对对象的引用,它就不会被垃圾收集。

你说得对。您缺少的是堆栈上不再存在引用。

对于在堆栈上构造对象的代码:

StringBuilder ref1 = new StringBuilder("object1");

变量ref1存储在堆栈中的某个内存位置:

                 0x403730:
Stack Pointer -> 0x40372C: pointer to ref1
                 0x403728: saved value of EBP
                 0x403724: saved value of return address
                 0x403720

现在是下一行:

StringBuilder ref2 = new StringBuilder("object2");

指向ref2的指针将存储在哪里?在堆栈上:是的。但是堆栈上的什么地方呢?当然,在用于ref1的同一内存位置中

                 0x403730:
Stack Pointer -> 0x40372C: pointer to ref2
                 0x403728: saved value of EBP
                 0x403724: saved value of return address
                 0x403720

简单地将另一个值推到堆栈上是愚蠢的:

Stack Pointer -> 0x403730: pointer to ref2
                 0x40372C: pointer to ref1
                 0x403728: saved value of EBP
                 0x403724: saved value of return address
                 0x403720

这将是愚蠢的,因为不再需要ref1

这就是为什么ref1有资格使用垃圾回收机制:不再有任何对它的引用。

 类似资料:
  • 本文向大家介绍Python垃圾回收机制?相关面试题,主要包含被问及Python垃圾回收机制?时的应答技巧和注意事项,需要的朋友参考一下 引用计数 标记清除 分代回收  

  • 主要内容:总结通过前几节对可利用空间表进行动态存储管理的介绍,运行机制可以概括为: 当用户发出申请空间的请求后,系统向用户分配内存;用户运行结束释放存储空间后,系统回收内存。这两部操作都是在用户给出明确的指令后,系统对存储空间进行有效地分配和回收。 但是在实际使用过程中,有时会因为用户申请了空间,但是在使用完成后没有向系统发出释放的指令,导致存储空间既没有被使用也没有被回收,变为了 无用单元或者会产生 悬挂访问

  • Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。 1 引用计数 PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象

  • 本文向大家介绍JS的垃圾回收机制?相关面试题,主要包含被问及JS的垃圾回收机制?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: GC(garbage collection),GC执行时,中断代码,停止其他操作,遍历所有对象,对于不可访问的对象进行回收,在V8引擎中使用两种优化方法, 分代回收,2、增量GC,目的是通过对象的使用频率,存在时长来区分新生代和老生代对象,多回收新生代区,少回收老

  • 问题内容: 这个问题来自Kathy Sierra SCJP 1.6 。有多少对象可以进行垃圾收集? 根据Kathy Sierra的回答,它是。这意味着两个对象可以进行垃圾回收。我已经给出了答案的解释。 但是,为什么不符合垃圾收集(GC)的条件? 何时到达,有多少对象可以使用GC? 答:0 B:1 C:2 D:编译失败 E:不可能知道 F:在运行时引发异常 回答: C是正确的。仅一个CardBoar

  • 这个问题取自凯西·塞拉SCJP 1.6。有多少对象符合垃圾收集的条件? 根据凯西·塞拉的回答,它是。这意味着有两个对象可以进行垃圾收集。我已经解释了答案。但是为什么不符合垃圾收集(GC)的条件呢? 当到达时,有多少对象符合GC条件? A:0 答复: C是正确的。只有一个硬纸板对象(c1)符合条件,但它有一个关联的wrapper对象也符合条件