私はこの高頻度生産システムで作業しています。 C++ライブラリを呼び出すC#/ CLIレイヤがあります。私たちが観察しているのは、管理対象オブジェクトがガラベージコレクターの第2世代に入り、「つぶれている」ということです。最終的にC#アプリケーションはRAMがなくなると停止するようになります。これらの管理対象オブジェクトはローカルオブジェクトであり、非常に寿命が短くなければなりません。また、それらは一度しか参照されません。 C#アプリケーションは、すべてが強制的に削除されるようにネイティブリソースを保持するすべてのオブジェクトに対して.Dispose()を呼び出す必要があります。私たちはかなりのオブジェクトを持っているので、これは理想的ではなく、APIの観点から見ると面倒です。 CLIは次のようになります。CLIネイティブオブジェクトがgen2にスタックされ、ガベージコレクトされていない
Field::~Field()
{
if(m_pField != NULL)
{
delete m_pField;
m_pField = NULL;
}
System::GC::SuppressFinalize(this);
}
Field::!Field()
{
if(m_pField != NULL)
{
delete m_pField;
}
}
これらの短命のオブジェクトが収集されずにメモリが解放されるようなことは誰も想像できませんか?
「C#/ CLI」ではなく、['C++/CLI'](https://en.wikipedia.org/wiki/C%2B%2B/CLI)と呼ばれています。正しい用語を使用することを忘れないでください。そうしないと、問題の解決策を探す際に情報を見つけることが難しくなります。 –
一時的なオブジェクトが第2世代に昇格できる実際的なシナリオはあまりありません。クリスタルボールはファイナライザスレッドがデッドロックしていると言います。アンマネージデバッガで見てください。 –
回顧的には、これらのことがgen 1に入り、分析が間違っていました。スコッツの推論は理にかなっています。 – UltimateDRT