Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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
Java 在树中使用弱引用(或软引用等)作为父引用是否值得?_Java_Garbage Collection_Weak References - Fatal编程技术网

Java 在树中使用弱引用(或软引用等)作为父引用是否值得?

Java 在树中使用弱引用(或软引用等)作为父引用是否值得?,java,garbage-collection,weak-references,Java,Garbage Collection,Weak References,为了提高GC效率,也就是说,对于给定的堆大小,周期性GC扫描暂停的时间更短和/或频率更低,在父子树中使用子树中的弱引用来引用其父树以防止GC引用循环是否值得?或者差别可以忽略不计 澄清一下,我的意思是使用弱引用而不是强引用。可以假设我需要从子级访问父级,从父级访问子级,因为需要在遍历之外进行访问。我不是JVM内部的专家,但这似乎更糟。当无法通过强链接访问对象时,软/弱链接起作用。传出链接不应影响对象进行垃圾回收的资格。指向父级的链接已传出。考虑两种情况: 孩子有资格进行垃圾收集,祖先有资格进行

为了提高GC效率,也就是说,对于给定的堆大小,周期性GC扫描暂停的时间更短和/或频率更低,在父子树中使用子树中的弱引用来引用其父树以防止GC引用循环是否值得?或者差别可以忽略不计


澄清一下,我的意思是使用弱引用而不是强引用。可以假设我需要从子级访问父级,从父级访问子级,因为需要在遍历之外进行访问。

我不是JVM内部的专家,但这似乎更糟。当无法通过强链接访问对象时,软/弱链接起作用。传出链接不应影响对象进行垃圾回收的资格。指向父级的链接已传出。考虑两种情况:

  • 孩子有资格进行垃圾收集,祖先有资格进行垃圾收集 也我希望所有的树都有资格接受垃圾 收藏
  • 儿童没有资格进行垃圾收集,因此 与祖先没有很强的联系。如果祖先只能到达 通过薄弱环节,则应进行GCD。这会影响到你吗 程序的正确性
当谈到性能时,编写无GC程序比使用较弱的引用类型提供了更多的可预测性。编写无GC是处理垃圾收集的首选方法(如果这是性能问题的原因)


有关更多详细信息,您可以参考白皮书。

这取决于您如何使用树

如果不需要树的父元素,也不引用应用程序其他部分的父元素,那么使用从子元素到父元素的某种弱引用可能会有好处。请记住,您将允许对父元素进行任意垃圾收集。此外,您的树必须非常大才能看到周期GC中的任何差异


当然,如果您不需要始终引用父元素,我会考虑不保留父参数。这将使您的实现更加一致且不那么复杂。

Java在引用循环方面没有问题,因此如果这是您唯一关心的问题,那么,不,您不需要使用弱/软引用作为父引用。

到目前为止,您试图找到什么?在引用计数系统中,您不能有循环,并且正在转换为java:)已经查看了许多文档,但没有提到对象句柄图的结构是否会影响GC性能。显然,父对象不会获取GC’ed。我认为他假设如果存在软链接,GC不会跟随它来确定哪些对象是可访问的。(只有弱引用才能访问的对象不需要以任何方式保存。)@aioobe,你能解释一下原因吗?我曾经认为,如果某个对象没有强引用,那么它应该是GCed。F.i.
WeakReference
文档中说:
弱引用对象,它不会阻止它们的引用被最终确定、最终确定,然后被回收
。(对象->WeakReference->符合GC条件)正确。那么GC需要遵循弱引用吗?(不,因为它发现的任何东西仍然可以被认为是“无法到达的”。)因此,我假设,一个弱引用甚至不会被遍历。哦,我明白了。谢谢你的澄清。对-我关心的是在句柄图中有很多循环,GC扫描算法会更昂贵并降低性能。如果这不是真的,那么我认为没有理由不将循环引用放置在从子级到父级的循环引用中。如果GC性能没有差异,那么没有理由不使用强引用。