Rubyでメモリリークを作成する方法
メモリリークを見つける方法についての記事がいくつかあります。
しかし、作成するのはどうですか?
Rubyでのメモリリークがどのように見えるかを知っているので、これは興味深い演習になると思います。
いくつかの例を見てみましょう。
単純なリーク
配列に新しいオブジェクトを追加するだけで、メモリリークが発生する可能性があります。
このように :
a = [] b = {} loop { sleep(1) 10_000.times { a << "abc" } puts GC.stat(b)[:heap_live_slots] }
これにより、毎秒10kの文字列が作成され、オブジェクト数が出力されます:
285051 295052 305053 315054 325055 335056 345057 355058
GCはこれらの文字列を収集できないため、カウントは増え続けます。これらの文字列は、含まれている配列(a
)によって参照されています。 。
a
の場合 GCがこれらすべての"abc"
を収集できる範囲外になります 文字列。 a
を設定することで、上記の例でこれをテストできます。 nilに変更してから、GC.start
を実行します 。
ここで実際の例を見つけることができます。run
をクリックするだけです。 結果を確認します。
Cエクステンションリーク
Rubyからオブジェクトを作成する場合、GCは使用しているメモリの量を追跡しますが、C拡張機能を使用する場合、Rubyは何が起こるかを制御できません。
このようなC拡張機能を作成する場合:
#include <ruby.h> #include "extconf.h" void *ptr; void Init_extension() { allocate_memory(); } void allocate_memory() { for(int i = 0; i < 10000; i++) { ptr = malloc(1000); } }
allocate_memory()
関数はmalloc
を使用しているため、メモリリークが発生します &それはfree
を呼び出しません そのメモリを解放します。
あなたがここで見ることができるように:
`ps -o rss -p #{$$}`.lines.last # "49036" require './extension' `ps -o rss -p #{$$}`.lines.last # "89512"
この種のリークは、ヒープダンプやGC.stat
には表示されません。 、ただし、メモリ使用量が増加します。
概要
これで、メモリリークがどのように見えるかがわかりました。この問題が発生した場合に、メモリリークをより早く見つけるのに役立つことを願っています。ところで、Ruby 2.4.1には既知のメモリリークがあるため、この特定のバージョンを使用している場合はアップグレードすることをお勧めします。
質問、フィードバック、または興味深いメモリリークデバッグストーリーがありますか?以下にコメントを残してください🙂
読んでくれてありがとう!
-
Google Chrome のメモリ使用量/メモリ リークの問題?
私はインターネットの閲覧に Google Chrome を使用するのが大好きです。その主な理由の 1 つは、常に超高速であることです。すべてのアドオンで Firefox が肥大化するのは好きではありませんでしたし、Internet Explorer は単純に遅いだけです。 Microsoft Edge は IE よりもかなり高速ですが、他の Google サービスを非常に多く使用しているため、Chrome に引き離され続けています。 Firefox の新しい Quantum ブラウザは Chrome よりもさらに高速で、切り替えを真剣に考えていました。 初めて Chrome を使い始めたと
-
Windows 11 でファイル エクスプローラーのメモリ リークを修正する方法
デバイスを Windows 11 にアップグレードしましたか?最近、Windows 11 でメモリ リークが発生している場合は、役立つ解決策がいくつかあるかもしれません! 多くのユーザーが、Windows 11 にアップグレードした後、メモリ リークの問題に苦しんでいると不満を漏らしています。Windows でメモリ リークが発生するのは、プロセスまたはアプリケーションがシステム リソースを解放しない場合、またはRAM が不要になったとしても。したがって、RAM の特定のブロックがアプリまたはシステム プロセスによって解放されない場合、RAM が占有され、PC のパフォーマンスが低下します。最