繁体   English   中英

关于Java垃圾收集,需要澄清

[英]On Java garbage collection, clarification needed

new A() ,我们分配足够的内存来保存A包含的所有对象。

对象A()可能包含其他对象,如B()C()

问题1:当不再需要A()并且你想将它从堆中删除时,将它的引用设置为null做到吗? (如果没有,什么是信号的正确的方式JVMGC 现在这个目标?)

问题2:如果是这样,指向B()C()的实例会发生什么

问题3:有没有办法可以观察到这种效果? (释放内存以释放对象)

将A设置为null将标记A作为GC释放的候选者。 如果对这些实例的唯一引用来自实例A,则也会标记B和C的实例。

编辑问题3:调试此效果的一种简单方法是使用方法finalize ; 当一个对象被GC控制时,他的finalize被调用。

但是,请注意此方法:不保证始终执行finalize(因为GC不能保证释放对象),并且绝不应该将其用于应用程序的一般用途。

根据您的IDE,有更好的调试工具。 例如,在eclipse中: http//www.yourkit.com/docs/80/help/garbage_collection.jsp

如果您有BC实时参考,那么它将不会GCed

在任何时候,如果任何对象没有对它的实时引用,该对象就可以进行GCed了

class A{
 B b = new B();
 C c = new C();
}

现在当你这样做

A a = new A();
a= null;//instance referred by a,b & c are ready to be collected in this system

对象A()可能包含其他对象,如B()和C()

对象仅包含对其他对象的基元和引用。

问题1:当不再需要A()并且你想将它从堆中删除时,将它的引用设置为null可以做到吗?

它很少需要,但你可以做到这一点。

问题2:如果是这样,指向B()和C()的实例会发生什么

没什么,它们是无关的对象。

问题3:有没有办法可以观察到这种效果? (释放内存以释放对象)

您可以覆盖finalize()方法或使用ReferenceQueues。 这只会告知您收集的对象而不是丢弃对象。 最好避免需要这样做。


可以收集没有来自根上下文的强引用的对象,例如线程堆栈。 这怎么会发生并不重要。 将引用设置为null可以允许这种情况发生,但更常见的是允许变量超出范围是丢弃对象的更简单方法。

如果你有对象B并且指向C指向B并且没有对这些对象的其他引用,即使存在对这些对象的引用,它们仍将被清除。

您无法强制GC删除对象。 GC将自动删除任何可安全删除的对象。 您可以通过调用System.gc()强制GC运行, System.gc()将删除它可以执行的任何对象。

仅当没有对该对象的其他引用时, A = null才会删除该对象。

通常GC存在,因此您不必担心删除和内存收集。 如果一个东西可以安全删除,它最终会被删除。

如果A停止指向它们,则将删除B()C() ,并且A是唯一指向它们的东西。

  1. 如果你将它设置为null,那么它是一个信号,要求GC在需要内存时释放内存。 但只有在没有更多实例引用该对象时才会发生这种情况。

  2. 如果仍然存在引用对象的实例,则在完全没有引用该对象的实例之前,它将不会进行GC编辑。 因此,只有当A()是引用它们的唯一一个时,B()和C()才会被GC编辑。

  3. 使用Java通过扫描程序读取大文本文件(大约3mb),然后关闭并丢弃扫描程序,并在完成后调用System.gc(),可以很容易地观察到这种效果。

如果取消对A的所有引用,并且如果没有对B和C的其他实时引用,那么当GC运行时,这些引用也将被GC。

调用System.gc()并不能保证gc会立即运行。 它可能运行也可能不运行,根本没有保证。

And There is no guaranteed way to force gc run immediately as you request it.

是的,你可以看到效果,因为gc运行释放内存。

要查看有关堆/内存使用情况的可视图/信息...,您可以使用jdk工具,在以下位置找到它的窗口:

JAVA_HOME\bin\jconsole.exe 

它是一个规则的拇指that when an object has NO reference attached to it, its a toast for the Garbage collector to eat.

标记为null将使A成为GC的祝酒词。 如果指向A的引用是对B和C的唯一引用,那么这两个引用都是垃圾收集的候选者

finalize是对象类方法,在对象为Garbage Collected时调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM