Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

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には既知のメモリリークがあるため、この特定のバージョンを使用している場合はアップグレードすることをお勧めします。

質問、フィードバック、または興味深いメモリリークデバッグストーリーがありますか?以下にコメントを残してください🙂

読んでくれてありがとう!


  1. Google Chrome のメモリ使用量/メモリ リークの問題?

    私はインターネットの閲覧に Google Chrome を使用するのが大好きです。その主な理由の 1 つは、常に超高速であることです。すべてのアドオンで Firefox が肥大化するのは好きではありませんでしたし、Internet Explorer は単純に遅いだけです。 Microsoft Edge は IE よりもかなり高速ですが、他の Google サービスを非常に多く使用しているため、Chrome に引き離され続けています。 Firefox の新しい Quantum ブラウザは Chrome よりもさらに高速で、切り替えを真剣に考えていました。 初めて Chrome を使い始めたと

  2. Windows 11 でファイル エクスプローラーのメモリ リークを修正する方法

    デバイスを Windows 11 にアップグレードしましたか?最近、Windows 11 でメモリ リークが発生している場合は、役立つ解決策がいくつかあるかもしれません! 多くのユーザーが、Windows 11 にアップグレードした後、メモリ リークの問題に苦しんでいると不満を漏らしています。Windows でメモリ リークが発生するのは、プロセスまたはアプリケーションがシステム リソースを解放しない場合、またはRAM が不要になったとしても。したがって、RAM の特定のブロックがアプリまたはシステム プロセスによって解放されない場合、RAM が占有され、PC のパフォーマンスが低下します。最