我有一个在晚上7:41拍摄的Java Heap Dump,正在使用Eclipse Memory Analysis Tool进行分析。堆转储包括20个会话对象。
在我的堆中对其中一个会话对象使用Path to GC Roots命令显示了以下3个对该会话对象的引用:
1.来自Finalizer线程拥有的“未完成”链接列表的finalizer引用。我的对象是第三个要完成的对象。
2.从消息处理程序线程对会话对象的强引用,该线程本身被一个定时清理TimerTask引用,计划在晚上7:11运行。
3.从WeakHashMap $ Entry对会话对象的弱引用。WeakHashMap由静态强引用保持活动状态。
当会话对象仍具有强引用和弱引用时,它如何在终结器队列中?
在其余的19个会话对象中,还有1个在终结器队列中,具有类似的弱引用。其他18个会话对象仅具有弱引用。为什么GC没有清除这些弱引用?
一些一般性的观点:
1.只有在弱引用被清除后,对象才有资格进行终结(http://download.oracle.com/javase/6/docs/api/java/lang/ref/package-summary.html)
2.会话对象没有终结器可以使其复活,即使它有,也不能在对象仍在未完成队列中排在其他对象之后运行。
3.我的应用程序不使用幽灵引用,这是唯一能够在对象有资格进行终结后仍然存在的引用。即使我的应用程序使用幽灵引用,这些对象也不会公开它们所持有的对象的引用。
在我的堆中对其中一个会话对象使用Path to GC Roots命令显示了以下3个对该会话对象的引用:
1.来自Finalizer线程拥有的“未完成”链接列表的finalizer引用。我的对象是第三个要完成的对象。
2.从消息处理程序线程对会话对象的强引用,该线程本身被一个定时清理TimerTask引用,计划在晚上7:11运行。
3.从WeakHashMap $ Entry对会话对象的弱引用。WeakHashMap由静态强引用保持活动状态。
当会话对象仍具有强引用和弱引用时,它如何在终结器队列中?
在其余的19个会话对象中,还有1个在终结器队列中,具有类似的弱引用。其他18个会话对象仅具有弱引用。为什么GC没有清除这些弱引用?
一些一般性的观点:
1.只有在弱引用被清除后,对象才有资格进行终结(http://download.oracle.com/javase/6/docs/api/java/lang/ref/package-summary.html)
2.会话对象没有终结器可以使其复活,即使它有,也不能在对象仍在未完成队列中排在其他对象之后运行。
3.我的应用程序不使用幽灵引用,这是唯一能够在对象有资格进行终结后仍然存在的引用。即使我的应用程序使用幽灵引用,这些对象也不会公开它们所持有的对象的引用。