Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management 当对象在运行时解除分配时,确保为nil或null值_Memory Management_Compiler Construction_Garbage Collection_Automatic Ref Counting - Fatal编程技术网

Memory management 当对象在运行时解除分配时,确保为nil或null值

Memory management 当对象在运行时解除分配时,确保为nil或null值,memory-management,compiler-construction,garbage-collection,automatic-ref-counting,Memory Management,Compiler Construction,Garbage Collection,Automatic Ref Counting,参考计数和弧透视图 在Swift或Objective-C中,如果引用计数器变为零,则对象被解除分配,并且指向该对象的每个指针值(包括弱变量或属性)变为空。 他们是怎么做到的 手动内存管理透视图 在C或C++中,如果我们释放内存,它只释放内存。如果我们想让它为NULL,我们手动分配NULL。只付我们需要的钱,我们不会得到额外的 自动GC透视图 在Java中,VM监视对象引用的使用,并按时间间隔收集它们。不需要设置空值。但有一种类型WeakReference,允许收集器在标记阶段在引用时忽略某些对象

参考计数和弧透视图
在Swift或Objective-C中,如果引用计数器变为零,则对象被解除分配,并且指向该对象的每个指针值(包括弱变量或属性)变为空。 他们是怎么做到的

手动内存管理透视图
在C或C++中,如果我们释放内存,它只释放内存。如果我们想让它为NULL,我们手动分配NULL。只付我们需要的钱,我们不会得到额外的

自动GC透视图
在Java中,VM监视对象引用的使用,并按时间间隔收集它们。不需要设置空值。但有一种类型
WeakReference
,允许收集器在标记阶段在引用时忽略某些对象

我的问题是,从编译器或虚拟机的角度来看,如何确保将
nil
null
值分配给先前引用对象的变量?

因为这个问题的措辞并不正确。您的问题还假定了基于引用计数的收集,这对循环数据结构不太有效,例如:

class LinkedList(object):
    def __init__(self, next = None):
        self.next = next
    def set_next(self, next):
        self.next = next
...
e1 = LinkedList()
e2 = LinkedList(e1)
e1.set_next(e2)
(用Python表示)。当e1.next.next也是e1时,e1的参考计数是多少,以便e1.next.next.next是e1,依此类推?(或者,更简单地说,如果我们在e1本身旁边设置e1

传统的Lisp垃圾收集始于(注意:我不知道这个网站总体上是否好,但是我扫描了链接的文章,它看起来不错)。现代系统通常有更奇特的方案,例如分代收集、“实时”(线程)收集而不是走走停停,以及实时收集。请参阅,尤其是更全面的文章

请注意,强引用和弱引用之间的关键区别在于,在活跃度分析中计算强引用,即,在确定是否保留某个对象时,因为其他对象需要它,而弱引用不需要。我所知道的最经典的例子是在查找缓存中需要弱引用,其中存在一些复杂的数据结构,例如基于磁盘B树的数据库或类似数据库,其中一些对象可能会被带到内存中使用一段时间,我们希望有一个快速的方法来确定它们是否仍然可用:
dictionary[key]
将是对对象的快速但弱的引用,而
database.load(key)
可能在加载对象后返回对该对象的强引用

许多实现细节源于诸如语言本身是否以及如何允许您使用指针之类的问题。具有指针操作的语言(如C++)使编译时分析变得困难,而其他语言(如Go)则使之更容易

,from,对其中几个问题和实际实现进行了很好的总结,包括Swift中使用的两个问题


Go语言用于在堆栈上分配一些对象,在垃圾收集堆中分配其他对象。

这是一种扩展方法。但无论如何,除非您在设计语言和虚拟机时考虑到这一点,否则这通常是不可能的。虚拟机实际上没有引用对象的实际变量,只有对象本身和它们的引用计数器..就这么做吧!我的意思是,我不明白你的问题:/你可以释放/释放你的对象,然后将指针设置为0。到底是什么问题?对于Swift,请参见示例。我怀疑“如果引用计数器变为零,则对象被解除分配,并且指向该对象的每个指针值……变为空”是否是对常规操作的有效描述。毕竟,基本假设是当计数器达到零时,没有剩余的指针,那么为什么实现要浪费时间搜索一些指针以将它们设置为NULL呢。所以清除指针的问题只适用于弱引用和类似的引用,这是垃圾收集的一个特例。是的,这是一篇有趣的文章。对于使用遍历的内存管理,就像Java一样,任务更加简单。在遍历过程中,它将通过链接来记住所有遇到的
WeakReference
实例,然后,如果在遍历过程中没有遇到它们的引用,它将遍历该链接列表一次并清除它们,否则将取消链接。然后,该列表被交给另一个线程,如果清除的引用对象与
ReferenceQueue
关联,则该线程将使其排队。排队可以同时发生在应用程序上。