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

ガベージコレクションの概要(パートI)

コードを実行するときはいつでも、メモリを使用します。 Rubyのような言語で書くと、利用できるメモリは無限にあるように見えます。コードを実行しているシステムにある固定量のメモリについて考えることなく、そのまま続けることができます。このRubyMagicのエピソードでは、これがどのように機能するかを説明します!

ちょっとした歴史

当時、Rubyなどのスクリプト言語はまだ存在していませんでした。人々は、低水準プログラミング言語であるCなどの言語でのみコードを記述しました。これらの言語を低レベルにする理由の1つは、自分でクリーンアップする必要があることです。たとえば、Stringを格納するためにメモリを割り当てるときはいつでも 、いつクリーンアップするかも決定する必要があります。

手動クリーンアップ

これは、次の模擬Rubyコードのように見えます。変数を宣言し、メソッドfreeを使用します –このメソッドは実際にはRubyには存在しません–変数の処理が完了した後に使用したメモリをクリーンアップします。

1_000_000.times do |i|
  variable = "Variable #{i}"
  puts variable
  free(variable)
end

面倒なプログラミング方法

ここにはリスクがあることにすでに気付いているかもしれません。freeを忘れた場合はどうなるでしょうか。 変数?その場合、その変数の内容は、プロセスが終了するまでメモリに残ります。これを十分な頻度で行うと、メモリが不足し、プロセスがクラッシュします。

次の例は、別の一般的な問題を示しています。

1_000_000.times do |i|
  variable = "Variable #{i}"
  free(variable)
  puts variable
end

変数を宣言し、free それ。しかし、それから私たちはそれを再び使用しようとします、それはもう存在しないので不可能です。これがCの場合、プログラムはsegfaultでクラッシュします。 。おっと!

人間は間違いの機械です

人間はこの種の間違いをいつもしないのが苦手なことで有名です。したがって、メモリを自動的にクリーンアップする方法が必要です。これを行う最も一般的な方法(Rubyでも使用されます)は、ガベージコレクション(GC)です。

ガベージコレクション(GC)の仕組み

GCを使用する言語では、オブジェクトを手動でクリーンアップせずにオブジェクトを作成できます。オブジェクトを作成するたびに、そのオブジェクトはガベージコレクターに登録されます。 GCは、このオブジェクトに対して行ったすべての参照を追跡しようとします。オブジェクトを使用していないと判断されると、クリーンアップのマークが付けられます。ガベージコレクタは時々プログラムを一時停止し、マークされたすべてのオブジェクトをクリーンアップします。

いくつかの例を見てください

以前に使用した単純なループでは、GCの仕事はかなり簡単です。ループが繰り返されるたびに、変数はどこにも使用されなくなります。変数はすぐにクリーンアップのマークを付けることができます。

1_000_000.times do |i|
  variable = "Variable #{i}"
  puts variable
end

次の例では、変数をputs_laterに渡します。 30秒間待機してから、putsするメソッド 変数。

def puts_later(variable)
  Thread.new do
    sleep 30
    puts variable
  end
end
 
1_000_000.times do |i|
  variable = "Variable #{i}"
  puts_later variable
end

この比較的単純な例では、ガベージコレクターの仕事はすでにかなり複雑です。 puts_laterで変数を参照していることを理解する必要があります 方法。このメソッドはスレッドを開始するため、ガベージコレクターはスレッドを追跡し、スレッドが終了するのを待つ必要があります。そうして初めて、変数にクリーンアップのマークを付けることができます。

複雑になったとき

複雑な例に立ち入ることなく、ガベージコレクターの仕事は本当に難しいと私が言うとき、私を信じてください。これは、GCが本番環境でオーバーヘッドと問題を引き起こす可能性がある理由も説明しています。メモリを適切にクリアするには、プログラムで何が起こっているのかを非常に詳細に理解する必要があります。これを正しく行うには、かなりのCPUサイクルが必要です。でもねえ、それはあなた自身の後片付けに勝る!

ガベージコレクションにはまだまだあります

これは、ガベージコレクションの紹介にすぎませんでした。今後の記事では、これがRubyでどのように機能するか、およびアプリケーションのパフォーマンスを向上させるためにGCを測定および調整する方法について説明します。

更新: 次のエピソードはこちらから入手できます。


  1. シェルスクリプト言語でのLinux「変数」の洞察–パート9

    Linuxシェルスクリプトに関する一連の記事はすでに書いています。 その時は暖かく迎えられ、今でも非常に重要でした。シェルスクリプトに関する記事のコレクションへのリンクは次のとおりです。 Linuxシェルスクリプトを学ぶ この記事では、変数を確認します。 、その実行とシェルスクリプトでの実装。 出力の保存 コマンドの出力は、標準出力またはファイルにリダイレクトでき、変数に保存することもできます。コマンドの出力が画面に収まらないほど大きい場合は、ファイルへの出力を変数に保存するオプションのみが残ります。出力を変数に保存することの利点の1つは、検査速度が速いことです。変数はメモリに保存さ

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

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