valgrindなどのメモリリーク検出ツールのサポートなしでプロセスにメモリリークがあるとどう結論付けることができますか?

valgrindなどのメモリリーク検出ツールのサポートなしでプロセスにメモリリークがあるとどう結論付けることができますか?

プロセスのRSS値(topまたはpsコマンドで取得した値)が急激に増加した場合は、メモリリークと見なすことができます。コードを修正するための規制が少なく、メモリ使用量を追跡するための新しいユーティリティのインストールのサポートが不十分であるとします。

独自のアプリケーションなので、ここにコードを提供することはできません。問題を絞り込んでみました。クライアントとサーバーデーモンの間に開いて閉じるすべてのopenSSL接続には、いくつかのメモリリークが発生します。サーバーデーモンは常に接続を待機する一般的なサーバーであり、接続が受け入れられるとクライアント要求を処理するためのスレッドを生成します。 openSSL1.0.1 バージョンです。リンクによると:https://stackoverflow.com/questions/29845527/how-to-properly-uninitialize-openssl

サーバー側に興味があるので、サーバークラスデストラクタに次のクリーンアップを追加しました。

void ServerClass::doCleanUp()
{
    CRYPTO_cleanup_all_ex_data();
    ERR_free_strings();
    ERR_remove_state(0);
    ERR_remove_thread_state(NULL);
    CRYPTO_set_locking_callback(NULL);
    CRYPTO_set_id_callback(NULL);
}

複数の反復に対して接続を開いて閉じるテストを実行した後、RSS値にわずかな違いがあります。つまり、(RSS_value_after_test_completion - RSS_value_at_startup)は正です。それでは、この+ veの違いはメモリリークと見なすことができますか?また、stackoverflowリンクによると、アプリケーションレベルのクリーンアップとスレッドレベルのクリーンアップという概念があります。以前のソリューションではEVP_cleanup()を使用していましたが、他のテストケースで問題が発生したため、同じ状況に戻りました。サーバーは常に稼働している必要があるため、DHパラメーターのアンロードに関連した活動を実行することはできません。私は何を逃したことがありませんか?追加案内をいただきありがとうございます。

いくつかの観察:観察1:5、10、30、60回の繰り返しのオンとオフのテストを行ったとき、プロセスのRSS値が特定の値(37.7 MB)に達するとその値から増加しないことが観察されました。 。 。注:- テストの繰り返し順序は、記載されたものと異なる場合があります。
観察2:1回のテスト反復でRSS値が約7MB増加することがわかります。観察3:テスターは特定の反復(例:100)に対してテストを実行するため、RSS値には常に+ ve差があり、リークが主張されます。

ベストアンサー1

不要:

  • ご使用のアプリケーションは、使用されなくなった項目を定期的に確認および削除するメモリ内データベースを維持している可能性があります。
  • Javaなどのアプリケーションは、定期的にガベージコレクションを実行できます。

メモリが不足しても設定が間違っている可能性があります(定期的な確認/消去状態に達できません)。

おすすめ記事