2017-01-31 19 views
0

私はいくつかのプール内のすべての接続を格納するサーバーアプリケーションを持っています。他のアプリへの接続が失われた後、私のアプリはネットワーク接続オブジェクトに必要なすべてのオブジェクトを破棄します。したがって、すべてのオブジェクトが正常に破棄され、db接続プールも破棄されますが、メモリは解放されません。プール内sqlite3 C APIはsqlite3_closeのメモリを解放しません

接続は、同様に保存されている:のSQLite DB接続の

std::unordered_map<int, DbConnection> connections; 

破壊は次のようである:

if (sqlite3_close(sqliteDB) != SQLITE_OK) 
{ 
    printf(errormsg); 
} 

問題は、この場合にSQLITE_OKを返す常にsqlite3_closeあります。だから、メモリを解放するはずですが、それはしません。そして再接続するたびに、私のアプリが消費するメモリ量はほぼ2倍に増えます!間違いなくsqliteのメモリはリリースされておらず、別のものではありません。しかし、私が大規模なツール(valgrindツール)で私のアプリケーションを実行すると、すべて正常に動作し、メモリリークは全くありません。だから私はこの問題を解決する方法を理解することはできません。私はfedora 19を使用していますが、すべてのLinuxディストリビューションでこのエラーを引き起こす可能性があります。

問題が何であるかは誰か知りませんか?

+0

OSは無料でメモリをただちに取り戻すことは保証しません。実際には、ほとんどの時間はそうしないと信じています。どのくらい正確にメモリ使用量を測定していますか? – SingerOfTheFall

+0

htopまたはtop on linux。 valgrind-massifで測定したdb接続プールIのメモリ使用量。 – slowcheetah

答えて

0

これはメモリの断片化のために起こります。そのため、OSはすぐに解放しません。 malloc_trim(0)はこの問題を解決するのに役立ちますが、完全に断片化したメモリの問題に見えます。しかしそれは別の話題です。

関連する問題