解決済み: 影響を受けるマシンに .NET 4.5 ベータ版がインストールされていたことが判明しました。
への呼び出しでデッドロック/無期限にハングする .NET4 を使用する C# アプリケーションがあります。
GC.AddMemoryPressure(12000000)
これは実稼働中のアプリであるため、実際にコードを共有することはできませんが、GC.AddMemoryPressure がハングする原因についてヒントを得たいと思います。
解決済み: 影響を受けるマシンに .NET 4.5 ベータ版がインストールされていたことが判明しました。
への呼び出しでデッドロック/無期限にハングする .NET4 を使用する C# アプリケーションがあります。
GC.AddMemoryPressure(12000000)
これは実稼働中のアプリであるため、実際にコードを共有することはできませんが、GC.AddMemoryPressure がハングする原因についてヒントを得たいと思います。
ご入力いただきありがとうございます。
影響を受けたマシンには.NET4.5ベータがインストールされていたことが判明しました。
1つのコアが完全に飽和していたため、デッドロックは発生しなかったようです。AddMemoryPressureの呼び出しは、関数clr!CNameSpace::GcScanRootsで終了したように見えました。
4.5ベータ版をアンインストールして.NET4をインストールすると、問題が解決したようです。
これが本当に問題だった場合は、MSがリリース前に修正することを願っています。
ドキュメントからのヒント:
加えた圧力を正確に取り除く必要があります。そうしないと、長時間実行されるアプリケーションのシステムのパフォーマンスに悪影響を与える可能性があります。
つまり、これら 2 つの呼び出しのバランスを取るには細心の注意を払う必要があります。
AddMemoryPresure
とRemoveMemoryPreasure
ちなみに、大量の管理されていないリソースを割り当てる場合に使用することをお勧めします。このようにGC
して、その量のメモリもカウントする必要があるという事実について通知します。
多くの場合、単純Dispose()
でFinalize()
正しい管理で十分です。
私は手動GCをいじりません。リソースが使用された後は、それらが破棄され、終了していることを確認してください。GC を手動で使用すると、システムが台無しになる可能性があります。.NET は、オブジェクトがプログラムで削除されている限り、GC を適切に管理します。