- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设您有一个 Collection<B>
,您将要删除一个项目。 B
的实例从 A
的实例中引用,并引用 C
的一个实例,如第一张图所示:
现在,因为有一个指向 B 的引用,所以对象被“删除”或被垃圾收集是毫无疑问的。它只是从集合中删除,就像这样,对吧?
现在,让我们有一个Collection<A>
具有与以前相同的引用层次结构,让我们删除 A 的一个实例。
如果没有其他引用 A
,它不仅会从集合中移除,还会被标记为垃圾。我对吗?那么B
呢?和 C
?如果除了 B
没有其他引用,它们也会变成垃圾吗?引用 C
的实例?
这是对我所面临的问题的简化。 我想删除一个 A
来自集合的实例,我想确保 B
和 C
在 A
的位置。不再在我的收藏中,所有还活着的“ child ”对我来说都是内存泄漏。
当我看着我制作的这些图片时,这个问题似乎太愚蠢了。但是我的情况有点不那么微不足道。它看起来像这样:
A Model
A Model
收藏了 B Model
实例(B
是 A
的子代,在模型层和 View 模型层)B Model
“知道它的父级”——引用它的父级“模型”实例我收藏了这些 A ViewModel
实例。当我删除一个时,我需要其他所有东西来配合它。如果没有对所涉及的任何实例的其他“外部引用”(基本上,没有其他箭头指向图片外部),删除的“A ViewModel”实例是否会带走所有子实例?如果是这样,是否有任何“陷阱”会使这种简化产生误导?如果我完全错了,为什么? :)
感谢您阅读到这里!
最佳答案
Provided there's no other "outside reference" to any of the instances involved (basically, no other arrow pointing coming in from outside of the picture), will the removed 'A ViewModel' instance take all the children with it?
是的,只要您的代码中没有对子项的引用,它将有资格进行垃圾回收,并且最终应该被回收。
If there's no other reference to A, not only it gets removed from the collection, it is marked as garbage. Am I right?
这实际上不是它的工作原理。 GC 不会“跟踪垃圾”——相反,它会检查当前正在执行的代码中的所有对象引用,然后走出去寻找当前“有效”的引用。那时剩下的任何东西都没有生命,然后才有资格收集。如果在你的图中到达“B”或“C”的唯一方法是通过“A”的那个实例,并且你从集合中删除“A”,那么所有这些都将有资格获得 GC 并在下一个适当的 GC 收集。
关于c# - .NET 删除父类会将子类变成 "garbage"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19779864/
想象一下,您从一种具有 GC 的语言中重复调用另一种语言(例如 Fortran 95)的函数。 Fortran 函数在调用之间的内存中留下了一些分配的东西,从调用者语言来看,这些东西可能被视为未引用的
我知道停止世界、增量、并行、并发、(软/硬)实时垃圾收集器的概念。但我无法理解大部分并发 GC。和并发GC有什么不同吗?有什么不同?为什么它被称为大部分? 最佳答案 I know concepts o
我正在浏览链接 Java - available garbage collection algorithms了解可用的 JVM 垃圾收集算法并感到困惑。 据我了解,不同的 JVM 供应商会实现一些标准
在打印 &a ( cout using namespace std; int main() { char a = 'Z'; cout<
当我在 Xcode 中“构建和分析”这段代码时,我收到一条我不理解的警告。这是有问题的方法: -(void)touchesMoved:(NSSet *)touches withEvent:(UIEve
C 编程语言有什么特点可以打破类型安全并禁止将实用的垃圾收集添加到该语言中?解释。首先,我不明白类型安全和垃圾回收之间的关系。如果有人可以帮助我,我将不胜感激。 最佳答案 您可以在C 中进行垃圾收集。
当成对实现停止和复制垃圾收集器时,我需要两个存储库(旧的和一个免费的新的)。一个存储库由汽车和CDS组成。因此,基本上,当我创建一个新地址时,它是指向thecars和the-cdrs的指针。 分配新内
我在 Ubuntu 18.04 上使用 SBCL 1.4.5。 似乎 SBCL 中的垃圾收集器没有正确释放绑定(bind)到具有符号键和值的哈希表的内存。有趣的是,当键和值是整数时,垃圾回收工作正常。
据说原子不是垃圾收集的。创建原子后,该原子将保留在原子表中,这可能最终导致内存泄漏! 我对Erlang还是很陌生,我的问题是:怎样收集垃圾中的原子?如果不可能的话,如何最大程度地减少这种影响? 最佳答
我一直在使用 Julia 对大量数据进行多线程处理,并观察到一种相互交织的模式。内存使用量(由 htop 报告)缓慢增长,直到进程被操作系统杀死。项目复杂,很难做出合适的MWE,但我做了一个简单的实验
假设堆上的一个对象超出范围。为什么程序不能在范围结束后立即释放内存?或者,如果我们有一个指向一个对象的指针,该指针被一个新对象的地址替换,为什么程序不能在分配新对象之前释放旧对象?我猜不是立即释放它而
我正在编写一个包含分代垃圾收集器的程序。只有两代。我想知道的是:在进行完整收集时,我是否通过首先收集年轻对象,将幸存者提升到老年代,然后收集老年代来获得任何东西(性能方面),或者我应该只是垃圾收集所有
如何在 WinDGB 中设置断点才能看到对 GC.Collect() 的调用?我已经尝试过 bp clr!SVR::GCHeap::GarbageCollect 但它不起作用... 我正在使用 .NE
当我开始时 jvm (jdk 8) ,我找到了这个 cms gc 日志。它显示老年代使用 0K (0K(1747648K)),但 jvm 执行 cms collect 。为什么 ? 2019-01-3
我需要你的帮助来调查 Erlang 内存消耗问题。多么典型,不是吗? 我们有两种不同的部署方案。 在第一个方案中,我们在小型虚拟机(在 Amazon AWS 中)上运行许多相同的节点,每台机器一个节点
所以我尝试通过在Windows上运行这个程序来测试D垃圾收集器是否正常工作。 DMD 2.057 和 2.058 beta 都给出相同的结果,无论我是否指定 -release 、 -inline 、
如果我有 8GB RAM 并且我在 64 位 JVM 上使用以下内容 最大堆大小 6144MB 最大 perm gen 空间 2048MB 堆栈大小 2MB Q1 : perm gen空间是从max
移动垃圾收集器(例如分代收集器)会产生额外的生成代码,以跨GC安全点存储和重新加载引用。有没有人比不动的收集器量化这种开销的性能成本? 我之所以这样问,是因为我有兴趣设计一个收集器,该收集器可以有效地
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 6年前关闭。 Improve this questi
在复制垃圾收集器中,当我将对象从源空间复制到目标空间时,某些对象可能会被存储在寄存器中的指针引用。当垃圾收集发生时,该寄存器需要更新以指向目标空间。 问题是,垃圾收集是在程序的特定点执行的(比方说当用
我是一名优秀的程序员,十分优秀!