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 のパフォーマンスが低下します。最