1

いくつかのタスクを実行するために 3 つのスレッドを作成する、Solaris で実行されている C++ プロセスがあります。これらのスレッドはループで実行され、プロセスが実行されている限り実行されます。

しかし、プロセスのメモリ使用量が継続的に増加し、メモリ使用量が 4GB を超えるとプロセスのコア ダンプが発生することがわかりました。

メモリ使用量の増加の背後にある問題について、誰かが私にいくつかの指針を教えてもらえますか? メモリ不足によるプロセスのコア ダンプを防ぐにはどうすればよいですか?

スレッドの再起動は役に立ちますか?

どんなポインタも歓迎します。

4

1 に答える 1

4

いいえ、スレッドを再起動しても役に立ちません。

アプリケーションでメモリ リークが発生しているようです。

私の経験では、2 種類のメモリ リークがあります。

  • アプリケーションの終了時に確認できる実際のメモリ リーク
  • アプリケーションの存続期間中に増加するが、最後に正しくクリーンアップされる大きなリストのような「false」メモリ リーク

最初のタイプについては、終了時にアプリケーションによって解放されていないメモリを報告できるツールがあります。Solaris については知りませんが、Windows にはそれを実行できるツールが数多くあります。Unix の場合、Valgrind がこれを行うと思います。

2 番目のタイプについては、アプリケーションのメモリのスナップショットを作成できる Windows 用のツールもあります。数分または数時間 (アプリケーションによって異なります) の間隔で 2 つのスナップショットを作成し、ツールで比較します。おそらく、Solaris にはこのような類似のツールがあります。

これらのツールを使用すると、ツールはすべてのメモリ割り当てのコール スタックを保存する必要があるため、おそらくアプリケーションはより多くのメモリを使用する必要があります。このため、実行速度も大幅に低下します。ただし、この効果は、このツールを積極的に使用している場合にのみ表示されるため、実際の製品コードには影響しません。

したがって、Solaris でこの種のツールを探してください。私はすぐにそれをグーグルで検索し、次のリンクを見つけました: http://prefetch.net/blog/index.php/2006/02/19/finding-memory-leaks-on-solaris-systems/。これは出発点になる可能性があります。

編集:いくつかの追加情報: 正しい種類のメモリを見ていますか? 合計で 3GB しか割り当てていない場合でも、メモリの断片化により、仮想アドレス空間の合計が 4GB に達することがあります。残念ながら、これについてできることは何もありません (別のメモリ割り当て戦略を使用する以外は)。

于 2012-07-06T06:07:12.657 に答える