現在、特定のコア API のインターフェイスを構築しています。コアはネイティブ C で記述されており、C# を使用して HTTP 要求を適切なコア関数にリダイレクトする Web API をインターフェイスとして作成することにしました。ただし、http 要求を行うたびにメモリが増加し続けることがわかりました。その理由はわかりません。
私のシステムの仕組み:
次のように、httpリクエストを関数にマッピングするApiControllerがあります。
[ApiController]
public class MethodController : ControllerBase
{
public MethodController()
{
}
[HttpGet("load/{name}")]
public bool load(string name)
{
EngineMethods.Marshaller_EngineMethod_Load(name, out bool result);
return result;
}
EngineMethods は、P/Invoke を介してネイティブ C++ 関数を呼び出すために使用されるクラスです。load 関数は、次のコードにリダイレクトされます。
[DllImport(DllFilePath, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.I1)]
private extern static void load(string name, out bool ret);
public static void Marshaller_EngineMethod_Load(string name, out bool ret)
{
load(name, out ret);
}
load 関数は C++ で記述しています。次に、提供されたコア API を使用する必要があります (関数は既に実装されています)。コアはスレッドセーフではないため、すべての操作でこの Mutex を使用する必要があります。
//it takes a lambda expression as an argument and can return any specified type
template<typename ReturnType, typename FunctionType>
ReturnType EngineMutex(FunctionType lambda)
{
__try
{
enterCriticalSection_engine();
return lambda();
}
__finally
{
leaveCriticalSection_engine();
}
}
「ロード」関数を次のようにします。
void load(TCHAR *name, bool *ret)
{
*ret = false;
return EngineMutex<void>([&]
{
Core_load(name, ret);
});
}
今私の問題は、「localhost:xxx/load/something」をスパムするとメモリが増え続けることです。古くて無関係な記憶は解放されないようです。C# のガベージ コレクターも有効にならず、手動で開始しても何もクリーンアップされません。アンマネージ メモリを割り当てて解放しないようです。しかし、私がしているのは、与えられたコアの関数を使用することだけです。そして、そのコアを使用するソフトウェアはずっと前にリリースされており、その機能をスパムしてもメモリが増加しないため、コアにあった機能にはメモリリークがあってはなりません。私が考えることができるのは、アイドル状態になって閉じないスレッドだけです...わかりません。コア関数を調べたところ、引数として指定された名前をコピーする前に古い名前が解放されます(そして、私が理解できない他のロード処理を行います)。