質問: Sample() sample.root.mainloop() ```
回答: メモリリークは、不安ですよね、、、 ================== 私もWindowsサービスで、1年連続動作させてくれ!みたいな話で、結構がっつりと試験に時間をかけたことがあります。 私がメインでWindowsサービスに関わっていた時には、メモリの確保、破棄(new, deleteとか、malloc,freeとか)の確保サイズや確保時間などによって、しばらくはメモリが増加していく傾向だが(実際に確保している量よりも多く)ある程度で天井になるパターンとか、のこぎり状に、ある程度まで線形的に上がって、ストンと落ちるパターンとか、いくつかのパターンがありましたが、 どちらにしても、総じて、実際に確保している量よりも多めに確保されているのが実際です。 OSのヒープ管理の状態にもよりますが、細かいメモリを、new、deleteする度にメモリを割り当て、解放していたのでは、メモリ上のフラグメントが激しくなり、効率が落ちてしまうため、ある程度無駄を覚悟で連続的にメモリを確保し続けて、解放である程度大きなブロックができたら、OSに返却するという動作をしていると思われます。 また、このメモリの確保、解放の動作については、OSの種類や、使っているベースソフト(Python、JavaScript、C++&MFC、PHP・・・etc)によってそれぞれ実装が違うので、環境によって見た目のメモリの増減がちがってきます。 **さて本題です。** ============ メモリリークの判断ということですので、以下を参考に見られるとよいかと思います。 プライベートワーキングセットを見ましょう タスクマネージャのワーキングセットとかの数値は、さまざまな要素(他にロードしてるモジュールなんか)の関連もあるので)いまひとつ、ぼやっとしてしまいますので、ここは、メモリ(プライベート・・・)とか、 パフォーマンスモニタの、Process > PrivateBytes > 対象のプログラム、で長時間監視をしてみてください。 パフォーマンスモニタならCSVに吐き出せますので、可能であれば加速テスト(通常より多くの処理を走らせる)を行って、みてください。メモリリークしていれが、この値は確実に増加していきます。 この部分で、「自分の」プログラムがある程度リークしていない保証がとれます。 しかし、プライベートワーキングセットは落ち着いていても、プライベートではなく「ワーキングセット」が、もりもり増加をしていく可能性があります。これは、他でロードしているモジュールなど、自分で書いたプログラム領域では無い部分で、リークしている可能性を示しています。このあたりも見ておいた方がよいです。 ただし、先にも書きましたとおり、ある程度増加後、天井を打つようなら、それはリークではない可能性があります、このあたりは実際のプログラムの動作がわからないと、なんともですが。 リークは、メモリだけではありません、リソースリークも見ましょう こちらは、手っ取り早いのは、タスクマネージャで見られます(パフォーマンスモニタでも見られますので、上記のPrivateByteと一緒にログをとるのが楽です)。 1. ハンドル数 2. スレッド数 3. USERオブジェクト数 4. GDIオブジェクト数 この4つは、確実に見ておいた方がいい数値です。それぞれ徐々に増えていって減らないようであれば危険です。 ※この数値は、Windows10では、タスクマネージャでは見られない?のかな?パフォーマンスモニタで確認しないといけないかもしれません。 少々長文になりましたが、パフォーマンスモニタで、すこし長い時間見てみるのがよいかと思います。