jvm 终结器线程“卡住”-内存问题

xqk2d5yq  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(198)

我有两个线程:
1.保持活力-SocketCleaner

Keep-Alive-SocketCleaner
Stack Trace is:
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- waiting to lock <6401c483> (a java.util.concurrent.locks.ReentrantLock$NonfairSync) owned by "Finalizer" t@3
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
at sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:935)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.skip(BufferedInputStream.java:380)
- locked <2dbbb9aa> (a java.io.BufferedInputStream)
at sun.net.www.MeteredStream.skip(MeteredStream.java:152)
- locked <46de4de6> (a sun.net.www.http.KeepAliveStream)
at sun.net.www.http.KeepAliveStreamCleaner.run(KeepAliveStreamCleaner.java:133)
- locked <46de4de6> (a sun.net.www.http.KeepAliveStream)
at java.lang.Thread.run(Thread.java:750)
Locked ownable synchronizers:
- None

1.终结器:

Stack Trace is:
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Native Method)
- waiting on <3392bb6a> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:188)
Locked ownable synchronizers:
- locked <6401c483> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)

我可以看到线程转储分析器说:
终结器线程“卡住”-内存问题:如果终结器线程长时间处于BLOCKED或WAITING状态,则可能导致OutOfMemoryError。
我的应用程序发出OutOfMemoryError错误。但是我不知道为什么一个线程被另一个线程阻塞,以及为什么finalized正在等待另一个线程。
直到今天它一直工作得很好。

pxiryf3j

pxiryf3j1#

终结器线程没有卡住。finalizer线程正在等待一个ReferenceQueue,等待可finalizable对象,这很正常,因为大多数时候没有可finalizable对象。
不寻常的是,尽管没有执行finalize()方法,但报告终结器线程持有锁6401c483。最可能的原因是,以前执行的finalize()方法获取了锁,但没有释放它。
当I search for “deadlock SSL” in the bug list时,我发现多个条目。值得注意的是,finalization将被完全删除,据我所知,JDK实现类已经被修改,不再使用finalization,所以这个问题的根源应该在最新的Java版本中被消除。

相关问题