6

JRuby irb コンソールを起動して、次のように入力しました。

irb(main):037:0* GC.enable
(irb):37 warning: GC.enable does nothing on JRuby
=> true
irb(main):038:0> GC.start
=> nil
irb(main):039:0> 

プログラム中に JVM ガベージを手動で有効化または開始するにはどうすればよいですか?

約 500 MB のテスト データを生成して MySQL に保存する必要があるプログラムがあるため、質問します。プログラムは約 5 レベルのネストされたループを使用し、約 100 MB のテスト データを生成した後、ヒープ メモリがなくなるため、JVM メモリ ヒープ例外でクラッシュします。内側のループで作成されたすべての孤立したオブジェクトをクリーンアップできるように、外側のループを実行するたびにガベージ コレクターを実行させたいと思います。

4

2 に答える 2

12

あなたの質問に対する正確な答えは次のとおりです。

require 'java'

java_import 'java.lang.System'

# ...

System.gc()

ただし、JVM は通常GC を実行ますが、実行する場合と実行しない場合があります。これは JVM の実装に大きく依存します。また、パフォーマンスにもかなりの影響を与える可能性があります。

より良い答えは、ネストされたループの最後で、生成しているテスト データに参照が保持されていないことを確認することです。例:

class Foo; end

sleep(5)

ary = []
100_000.times { 100_000.times{  ary << Foo.new }; puts 'Done'; ary = [] }

これを で実行するとjruby -J-verbose:gc foo.rb、GC が定期的にオブジェクトを要求していることがわかります。これは、JVisualVM を使用しても非常に明確です (sleep例の は、JVisualVM で Jruby プロセスに接続するための時間を与えるためです)。

最後に、次のフラグを追加してヒープ メモリを増やすことができます-J-Xmx256m。詳細については、JRuby wikiを参照してください。

編集:偶然にも、Mario Camou が Madrid DevOps で最近発表した GC チューニングに関するマインドマップが、Nick Sieger によって再投稿されました。

于 2012-05-24T15:57:55.460 に答える
-1

Gc は JVM によって自動的に実行されるため、これは不可能です。必要な場合にのみオブジェクトを作成していることを確認してください。クラス レベルのオブジェクトを作成することは避け、どのオブジェクトがより多くのメモリを消費しているかを調べ、必要な場合にのみ作成してください。

于 2012-05-25T05:57:52.230 に答える