2

Rails アプリ (3.2.8) でのテストで、JRuby とガベージ コレクションに問題が発生しています。単体テストを実行するときは問題ありませんが、単体テストと機能テストの両方を実行するか、機能テストのみを実行すると、以下のような奇妙なスタック トレースで爆発する傾向があります。

何が起こっているのかわかりません。これは、Rails をアップグレードし、JRuby を 1.6.3 から 1.6.7.2 にアップグレードしたときにのみ発生し始めました。

 /home/mbridges/.rbenv/versions/jruby-1.6.7.2/bin/jruby -I"lib:test" -I"/home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib" "/home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb" "test/unit/**/*_test.rb"
   * WARNING: 'test: #channel_id should return the correct channel id. ' is already defined
 Loaded suite /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader
 Started
 ...............................................................................
 ...............................................................................
 ...............................................................................
 ...............................................................................
 ...............................................................................
 ...............................................................................
 ...........................................................

 Finished in 156.993 seconds.

 533 tests, 1030 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
 0% passed

 3.40 tests/s, 6.56 assertions/s
 /home/mbridges/.rbenv/versions/jruby-1.6.7.2/bin/jruby -I"lib:test" -I"/home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib" "/home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb" "test/functional/**/*_test.rb"
 LoadError: No such file to load -- java.lang.OutOfMemoryError: GC overhead limit exceeded
            depend_on at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:317
            depend_on at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:313
   require_dependency at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:225
          eager_load! at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/railties-3.2.8/lib/rails/engine.rb:439
                 each at org/jruby/RubyArray.java:1615
          eager_load! at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/railties-3.2.8/lib/rails/engine.rb:438
                 each at org/jruby/RubyArray.java:1615
          eager_load! at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/railties-3.2.8/lib/rails/engine.rb:436
             Finisher at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/railties-3.2.8/lib/rails/application/finisher.rb:53
        instance_exec at org/jruby/RubyBasicObject.java:1757
                  run at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/railties-3.2.8/lib/rails/initializable.rb:30
     run_initializers at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/railties-3.2.8/lib/rails/initializable.rb:55
                 each at org/jruby/RubyArray.java:1615
     run_initializers at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/railties-3.2.8/lib/rails/initializable.rb:54
          initialize! at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/railties-3.2.8/lib/rails/application.rb:136
             __send__ at org/jruby/RubyBasicObject.java:1698
                 send at org/jruby/RubyKernel.java:2097
       method_missing at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/railties-3.2.8/lib/rails/railtie/configurable.rb:30
               (root) at /home/mbridges/admin_tools/mbridges_dev/customer_service_tool/config/environment.rb:12
              require at org/jruby/RubyKernel.java:1042
               (root) at /home/mbridges/admin_tools/mbridges_dev/customer_service_tool/config/environment.rb:2
              require at org/jruby/RubyKernel.java:1042
               (root) at /home/mbridges/admin_tools/mbridges_dev/customer_service_tool/test/test_helper.rb:1
              require at org/jruby/RubyKernel.java:1042
             __file__ at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:10
                 each at org/jruby/RubyArray.java:1615
             __file__ at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:9
               select at org/jruby/RubyArray.java:2395
               (root) at /home/mbridges/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:4
 rake aborted!
 Command failed with status (1): [/home/mbridges/.rbenv/versions/jruby-1.6.7...]

 Tasks: TOP => without_schema_dump:functionals
 (See full trace by running task with --trace)

実際にはデータベースを制御していないため、Rakefile は少し異なります。移行をスキップする必要があります。

# .rake で終わる lib/tasks に配置されたファイルに独自のタスクを # たとえば lib/tasks/capistrano.rake に追加すると、それらは自動的に Rake で利用できるようになります。

require File.expand_path('../config/application', __FILE__)
require 'rake'

CustomerService::Application.load_tasks

namespace :without_schema_dump do
  Rake::TestTask.new(:units) do |t|
    t.libs << "test"
    t.pattern = 'test/unit/**/*_test.rb'
    t.verbose = true
  end
  Rake::TestTask.new(:functionals) do |t|
    t.libs << "test"
    t.pattern = 'test/functional/**/*_test.rb'
    t.verbose = true
  end
  task :run_tests => :environment do
    Rake::Task['without_schema_dump:units'].invoke
    Rake::Task['without_schema_dump:functionals'].invoke
  end
end

Rake::Task[:default].prerequisites.clear
Rake::Task[:default].actions.clear
task :default do
  puts 'WARNING: Default rake overwritten because of foreign key constraints (see Rakefile)'
  Rake::Task['without_schema_dump:run_tests'].invoke
end

ヘルプ?どんな助けでも大歓迎です!

4

1 に答える 1

0

おそらく、新しいJRubyはもう少し仕事をしていて、GCの限界に達しています:

GCは、「少なすぎる」メモリを再利用しながらGCの実行に多くの時間が費やされていないかどうかをチェックします...ヒープサイズを増やすと、この問題が解決するはずです。export JRUBY_OPTS="--client -J-Xmx=640m"

これもリグレッションの「バグ」である可能性がありますが、 1.6.xの別のリリースはないと思います。1.6.8にはいくつかのバックポートがあり、問題が解決しない場合や1.7.0で発生する場合に試すことができます。

http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#par_gc.oom

于 2012-11-12T07:35:25.897 に答える