[英]On Java garbage collection, clarification needed
在new A()
,我们分配足够的内存来保存A
包含的所有对象。
对象A()
可能包含其他对象,如B()
和C()
问题1:当不再需要A()
并且你想将它从堆中删除时,将它的引用设置为null
做到吗? (如果没有,什么是信号的正确的方式JVM
到GC
现在这个目标?)
问题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
如果您有B
和C
实时参考,那么它将不会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
是唯一指向它们的东西。
如果你将它设置为null,那么它是一个信号,要求GC
在需要内存时释放内存。 但只有在没有更多实例引用该对象时才会发生这种情况。
如果仍然存在引用对象的实例,则在完全没有引用该对象的实例之前,它将不会进行GC编辑。 因此,只有当A()是引用它们的唯一一个时,B()和C()才会被GC编辑。
使用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.