gpt4 book ai didi

java - .NET GC 卡在来自 finalizer() 的 JNI 调用上

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:20 26 4
gpt4 key购买 nike

我有一个使用 JNI 调用 Java 代码的 .NET 应用程序。在 .NET 终结器上,我们调用 JNI 调用来清理 Java 上的连接资源。但是这个 JNI 有时会卡住。正如预期的那样,这会卡住所有 .NET 进程并且永远不会发布。

您可以在下面看到我们从 .NET 获得的线程转储:

网络调用栈功能

.JNIEnv_.NewByteArray(JNIEnv_*, Int32) 
Bridge.NetToJava.JVMBridge.ExecutePBSCommand(Byte[], Int32, Byte[])
Bridge.Core.Internal.Pbs.Commands.PbsDispatcher.Execute(Bridge.Core.Internal.Pbs.PbsOutputStream, Bridge.Core.Internal.DispatcherObjectProxy)
Bridge.Core.Internal.Pbs.Commands.PbsCommandsBundle.ExecuteGenericDestructCommand(Byte, Int64, Boolean)
Bridge.Core.Internal.DispatcherObjectProxy.Dispose(Boolean)
Bridge.Core.Internal.Transaction.Dispose(Boolean)
Bridge.Core.Internal.DispatcherObjectProxy.Finalize()

完整的调用栈功能

ntdll!KiFastSystemCallRet 
ntdll!NtWaitForSingleObject+c
kernel32!WaitForSingleObjectEx+ac
kernel32!WaitForSingleObject+12
jvm!JVM_FindSignal+5cc49
jvm!JVM_FindSignal+4d0be
jvm!JVM_FindSignal+4d5fa
jvm!JVM_FindSignal+beb8e
jvm+115b
jvm!JNI_GetCreatedJavaVMs+1d26
Bridge_NetToJava+1220
clr!MethodTable::SetObjCreateDelegate+bd
clr!MethodTable::CallFinalizer+ca
clr!SVR::CallFinalizer+a7
clr!WKS::GCHeap::TraceGCSegments+239
clr!WKS::GCHeap::TraceGCSegments+415
clr!WKS::GCHeap::FinalizerThreadWorker+cd
clr!Thread::DoExtraWorkForFinalizer+114
clr!Thread::ShouldChangeAbortToUnload+101
clr!Thread::ShouldChangeAbortToUnload+399
clr!ManagedThreadBase_NoADTransition+35
clr!ManagedThreadBase::FinalizerBase+f
clr!WKS::GCHeap::FinalizerThreadStart+10c
clr!Thread::intermediateThreadProc+4b
kernel32!BaseThreadStart+34

最佳答案

我不知道 .NET 终结器是否与 Java 终结器同样是个坏主意,但是使用来自任何类似终结器(无论平台如何)的潜在(死)锁定代码(我在最底部看到 Win32 条件调用)是绝对是个坏主意。您需要清除任何潜在锁定的 native 代码,或者在 .NET 级别进行紧急制动超时

关于java - .NET GC 卡在来自 finalizer() 的 JNI 调用上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11971624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com