26

Ruby はすべてをヒープに割り当てますか、それともスタックに何かが格納されているインスタンスはありますか? 私は、すべての変数が本質的にスタック上にあり、ヒープ上のオブジェクトへの透過的な参照を含んでいるという印象を受けています。私はこの考えで正しいですか?この実装は固有のものですか?

また、変数がスタックに割り当てられ、隠しポインターのみを含む場合、変数自体は (それらが指すオブジェクトを無視して) 何バイト消費しますか?

編集:

この質問は、ファイバーの 4kB スタック制限がこの質問の問題になるかどうかを把握しようとしていたために尋ねられました。(MRI 1.9.3 では) 各変数自体が 1 バイトを消費し、ファイバーに関連するわずかなオーバーヘッドがあり、利用可能なスタック サイズが数バイト減少するようです。

このコードは 4,045 回目の反復で失敗します。

count = 0
loop do
  count += 1
  puts count
  varlist = String.new
  count.times do |i|
    varlist += "a#{i} = 1\n"
  end
  s = "fiber = Fiber.new do \n #{varlist} \n end \n fiber.resume"
  eval(s)
end
4

1 に答える 1

21

Ruby の実装に依存します。

たとえば、Ruby 2.0 MRI (ほとんどのシステムで典型的なもの) は、すべてのオブジェクトをヒープに格納します。短い文字列などの小さなオブジェクトは、ヒープに完全に収まります。大きなオブジェクトの場合、Ruby はヒープの外に追加のメモリを malloc します。

「MRI メモリ割り当て - 開発者向け入門書」および「Ruby GC のわかりやすい解説」を参照してください。

これは、 「Ruby がオブジェクトをメモリに格納する方法を理解する」です。これには、優れた長い説明があります。

「オブジェクトがメモリ内で占有するスペース全体がスロット内に格納されるわけではありません。むしろ、各スロットは小さな固定サイズのスペースであり、Ruby インタープリターがメモリ内の場所を処理すると考えることができます。この場所は Ruby ヒープの外側に存在します。明確にするために、50MB の文字列がある場合、50MB のデータは Ruby のヒープの外に格納されます.50MB のストーリーを本当に知りたい場合は、そのためのスペース実際には、C の malloc コマンドのようなものによって割り当てられ (古き良き Ruby は C で書かれているため)、システム ヒープに格納されます. Ruby ヒープのスロットには、システム ヒープ上のそのメモリ位置への参照が含まれているだけです。 50MBのデータ。」

「Ruby には独自のヒープ管理があり、Ruby プログラムの実行中に作成されたオブジェクトを管理するために、実際にはいくつかの「Ruby ヒープ」で構成されています。これは、オペレーティング システムのシステム ヒープとは別のものです。個々の Ruby ヒープにはそれぞれスロットがあり、各スロットに1 つのオブジェクトを参照できます。

もう 1 つの優れた情報源は、" How Ruby Manages Memory and Garbage Collection " で、" Garbage Collection Slides from LA Ruby Conference " のスライドにリンクしています。

「ガベージ コレクション言語として、Ruby はすべてをヒープに置くという簡単な方法を取ります」。

繊維

各ファイバーは独自の小さなスタックを取得するため、ファイバーは Ruby で特別です。

「他のスタックレス軽量同時実行モデルとは対照的に、各ファイバーには小さな 4KB スタックが付属しています。これにより、ファイバー ブロック内の深くネストされた関数呼び出しからファイバーを一時停止できます。」

動的なファイバー スタックのサイジングに関する長期にわたる機能要求に興味があるかもしれません。

現実世界のソリューションにもっと関心がある場合、機能要求の作成者は次の回避策を推奨しています:「大きなスタックを必要とする操作をリファクタリングして、別のスレッドで実行し、thread.value でブロックする」。

cont.cソース ファイルの FIBER_MACHINE_STACK_ALLOCATION_SIZE と FIBER_VM_STACK_SIZE を独自に選択して、カスタム バージョンの Ruby をコンパイルすることも検討できます。このファイルには、ファイバー スタックがどのように割り当てられ、解放されるかなども示されています。

于 2012-11-30T05:00:46.473 に答える