在约瑟夫·阿尔巴哈里(Joseph Albahari)的《C#5.0简言之》一书中,我发现了这一点
然而,根据加州大学伯克利分校的这堂课,只要堆栈上存在对该对象的引用,它就不会被垃圾收集。我的理解是,在方法返回之前,变量将保留在堆栈上。这意味着它引用的任何对象在方法返回之前都是活动的。
这是书中的错误还是java和。net垃圾收集工作有什么不同?
我的理解是,在方法返回之前,变量将保留在堆栈上。这意味着它引用的任何对象在方法返回之前都是活动的。
JIT可以在对象引用(“变量”)最后一次使用后随时删除它,因此这不一定是真的。
只要堆栈上存在对该对象的引用,就不会对其进行垃圾收集
这是真的——但是当这个变量不再“存在于堆栈上”时,JIT可能会以不一定匹配您的代码的方式改变。
在C#5中,这也会让人非常困惑,因为async
方法的重写方式会使变量在某些场景中停留的时间比预期的要长。
这就是说,如果您需要保证某个对象在某一点上是合格的,那么将引用该对象的变量显式设置为null
将允许您控制该对象何时显式合格。
这本书是正确的。
在。NET中,垃圾回收器具有变量在代码中使用的位置的信息,一旦未使用,对象就有资格使用垃圾回收机制。
(但是,如果在附加了调试器的情况下运行代码,垃圾收集器会更改行为。它会在变量的整个范围内保留对象,而不仅仅是在使用变量的位置,以便在调试器中调查对象。)
然而,根据加州大学伯克利分校的这个讲座,只要堆栈上存在对对象的引用,它就不会被垃圾收集。
你说得对。您缺少的是堆栈上不再存在引用。
对于在堆栈上构造对象的代码:
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对象也符合条件