在我们的服务器上,我们开始遇到OutOfMemoryError问题。我们使用EclipseMemoryAnalysis分析了堆转储,发现有许多对象被保留以进行终结(大约占堆的2/3):我们发现,它可能是一些finalize()方法阻塞。我发现了几个关于这个问题的错误报告(here或here),它总是在Finalizer线程堆栈中表现出来,它在某处被阻塞。但在我们的例子中,这个线程正在等待:"Finalizer"daemonprio=10tid=0x43e1e000nid=0x3ffinObject.wait()[0x43dfe000]java.lang.Thread.State:WAI
我们编写了一个控制台应用程序(将用作服务),它启动多个工作线程来处理通过mina传入的请求。当在特定网络端口上接收到停止信号时,应用程序离开主循环。这是停止服务的预期方式。这工作得很好,但是当收到停止信号时,应用程序的进程不会立即终止(最多需要5分钟)。我们通过日志消息验证了main函数已按预期快速离开,并且应用程序创建的所有线程也已终止。但应用程序继续运行。在离开主函数之前仍在运行的线程是:SignalDispatcher(java.lang.Thread)Finalizer(java.lang.ref.Finalizer$FinalizerThread)Abandonedconne
这个问题在这里已经有了答案:DoesJVM/GCcall`finalize()`onprogram/threadexit?(2个答案)关闭9年前。我知道youcan'tcountonfinalizers清理你的烂摊子(即免费资源),但我想知道-当JVM正常终止(System.exit()/没有剩余线程)时,java对象是否得到GC'ed/finalized?/p>编辑:因此,不能保证触发GC,因此finalize()也不能保证,但是ReferenceQueue会起作用吗?
我在查看WeakHashMap的源代码时偶然发现了这个:privatefinalReferenceQueuequeue=newReferenceQueue();privatevoidexpungeStaleEntries(){for(Objectx;(x=queue.poll())!=null;){synchronized(queue){/*snip*/}}}为什么这个方法在ReferenceQueue上同步?WeakHashMap本身并没有声称是线程安全的:Likemostcollectionclasses,thisclassisnotsynchronized.Asynchroniz
我想在其他线程不再引用时正确关闭Closeable对象。我写了一些小测试,但是在对象入队后,get方法返回null,即poll方法返回正确的没有引用对象的对象。publicstaticvoidmain(String[]args){ReferenceQueuereaped=newReferenceQueue();Closeables=;WeakReferencews=newWeakReference(s,reaped);s=null;System.gc();Closeablero=(Closeable)reaped.poll().get();ro.close();}提前致谢。任何帮助将不
有没有办法在弱引用被删除时得到提醒?我需要将一个Android上下文添加到一个实例,我将其添加为一个WeakReference然后我想在/如果它被删除时处理一些事情?我想我在某个地方读到过这个,但是因为我不记得在哪里搜索它没有给我任何东西:( 最佳答案 弱引用(wr)不提供回调。如果您需要适当的回调,可以重写对象的finalize方法以在它被垃圾收集(gc'd)时执行某些操作。wr提供的是一个referenceQueue(rq),它基本上是一个引用列表,其引用对象还没有被gc'd。您在引用的构造函数中附加一个referenceQue
我正在使用LWJGL库,不幸的是,每当我的场景图中的节点需要死亡时,我需要自己释放纹理/vbo缓冲区,我什至无法使用finalize()方法来做到这一点'不保证它将在opengl库期望的同一线程中执行。所以我正在使用PhantomReferences。在我的场景图节点中,我将其放入构造函数中:phantomReference=newScenePhantomReference(this,Game.phantomReferenceQueue);Game.phantomReferenceList.add(phantomReference);如您在第二行中所见,我已将phantomRefere
我有一个带有错误的Swing浏览器应用程序,当我在GUI中添加/删除时,没有为这些对象释放内存,我正在尝试追踪它们持有的内容。问题是我不知道如何判断某些东西何时真正从内存中完全释放。有没有办法判断一个对象是否已从内存中释放?我已经习惯了Objective-C,有几种方法可以告诉我。谢谢 最佳答案 你不能在Java中真正做到这一点。所有提到终结器的答案都不是你想要的。您能做的最好的事情就是将PhantomReference排入ReferenceQueue并轮询,直到获得引用。finalReferenceQueuerq=newRefer
我有一个带有错误的Swing浏览器应用程序,当我在GUI中添加/删除时,没有为这些对象释放内存,我正在尝试追踪它们持有的内容。问题是我不知道如何判断某些东西何时真正从内存中完全释放。有没有办法判断一个对象是否已从内存中释放?我已经习惯了Objective-C,有几种方法可以告诉我。谢谢 最佳答案 你不能在Java中真正做到这一点。所有提到终结器的答案都不是你想要的。您能做的最好的事情就是将PhantomReference排入ReferenceQueue并轮询,直到获得引用。finalReferenceQueuerq=newRefer
SoftReference和WeakReference真的只有在创建为实例变量时才有帮助吗?在方法范围内使用它们有什么好处吗?另一大部分是ReferenceQueue。除了能够跟踪哪些引用被确定为垃圾之外,Reference.enqueue()可以用来强制注册一个对象进行垃圾回收吗?例如,是否值得创建一个方法来占用对象中的一些大量内存资源(由强引用持有)并创建引用以将它们排入队列?ObjectbigObject;publicvoiddispose(){ReferenceQueuequeue=newReferenceQueue();WeakReferenceref=newWeakRefe