4

解決済み: 影響を受けるマシンに .NET 4.5 ベータ版がインストールされていたことが判明しました。


への呼び出しでデッドロック/無期限にハングする .NET4 を使用する C# アプリケーションがあります。

GC.AddMemoryPressure(12000000)

これは実稼働中のアプリであるため、実際にコードを共有することはできませんが、GC.AddMemoryPressure がハングする原因についてヒントを得たいと思います。

4

3 に答える 3

2

ご入力いただきありがとうございます。

影響を受けたマシンには.NET4.5ベータがインストールされていたことが判明しました。

1つのコアが完全に飽和していたため、デッドロックは発生しなかったようです。AddMemoryPressureの呼び出しは、関数clr!CNameSpace::GcScanRootsで終了したように見えました。

4.5ベータ版をアンインストールして.NET4をインストールすると、問題が解決したようです。

これが本当に問題だった場合は、MSがリリース前に修正することを願っています。

于 2012-05-16T07:16:13.617 に答える
2

ドキュメントからのヒント:

加えた圧力を正確に取り除く必要があります。そうしないと、長時間実行されるアプリケーションのシステムのパフォーマンスに悪影響を与える可能性があります。

つまり、これら 2 つの呼び出しのバランスを取るには細心の注意を払う必要があります。

AddMemoryPresureRemoveMemoryPreasure

ちなみに、大量の管理されていないリソースを割り当てる場合に使用することをお勧めします。このようにGCして、その量のメモリもカウントする必要があるという事実について通知します。

多くの場合、単純Dispose()Finalize()正しい管理で十分です。

于 2012-05-15T07:38:51.603 に答える
1

私は手動GCをいじりません。リソースが使用された後は、それらが破棄され、終了していることを確認してください。GC を手動で使用すると、システムが台無しになる可能性があります。.NET は、オブジェクトがプログラムで削除されている限り、GC を適切に管理します。

于 2012-05-15T07:50:20.490 に答える