加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 什么时候对象有资格进行垃圾回收?

发布时间:2020-12-15 18:17:29 所属栏目:百科 来源:网络整理
导读:参见英文答案 Understanding garbage collection in .NET3个 在Joseph Albahari的书中简要介绍了C#5.0,我找到了这个 一旦你传递了最后一个变量使用的代码行,它就会说它所引用的对象有资格进行垃圾收集(即如果没有其他变量持有对该对象的引用). 但是根据加州
参见英文答案 > Understanding garbage collection in .NET3个
在Joseph Albahari的书中简要介绍了C#5.0,我找到了这个

一旦你传递了最后一个变量使用的代码行,它就会说它所引用的对象有资格进行垃圾收集(即如果没有其他变量持有对该对象的引用).

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

这是本书中的错误还是java和.net垃圾收集的工作方式不同?

解决方法

However according to this lecture from UC Berkley,as long as a reference to the object exists on the stack,it won’t be garbage collected.

你是对的.您缺少的是堆栈中不再存在引用.

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

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有资格进行垃圾收集的原因:不再有任何引用它的原因.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读