2008-11-03 65 views
6

我正在運行一個奇怪的問題。 我的控制器調用DRB對象Drb和「被回收的對象」異常

@request_handler = DRbObject.new(nil, url) 
availability_result = @request_handler.fetch_availability(request, @reservation_search, params[:selected_room_rates]) 

,這DRB對象做一些搜索。

,但有時,在Linux環境中,我得到一個「0xdba87b30被回收對象」這個堆棧跟蹤

--- 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:375:in `_id2ref' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:375:in `to_obj' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1402:in `to_obj' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1704:in `to_obj' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:613:in `recv_request' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:911:in `recv_request' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1530:in `init_with_client' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1542:in `setup_message' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1494:in `perform' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1589:in `main_loop' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1585:in `loop' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1585:in `main_loop' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1581:in `start' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1581:in `main_loop' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1430:in `run' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1427:in `start' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1427:in `run' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1347:in `initialize' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1627:in `new' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1627:in `start_service' 
- (druby://10.254.143.159:9001) ./core/request_handler.rb:244 
- (druby://10.254.143.159:9001) /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require' 
- (druby://10.254.143.159:9001) /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/active_support/dependencies.rb:510:in `require' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/active_support/dependencies.rb:355:in `new_constants_in' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/active_support/dependencies.rb:510:in `require' 
- (druby://10.254.143.159:9001) core/request_handler.rb:31 
- (druby://10.254.143.159:9001) core/request_handler.rb:29:in `each' 
- (druby://10.254.143.159:9001) core/request_handler.rb:29 
- app/drops/room_drop.rb:18:in `room_rates' 
- lib/liquid/liquid_templates.rb:47:in `parse_template' 
- lib/liquid/liquid_templates.rb:21:in `render_liquid_template_without_layout' 
- app/helpers/skins_helper.rb:6:in `render_respond_by_format' 
- app/helpers/skins_helper.rb:4:in `render_respond_by_format' 
- app/helpers/skins_helper.rb:25:in `render_availability_action' 
- app/controllers/web_reservations_controller.rb:109:in `availability_simplified' 
- /usr/bin/mongrel_rails:19:in `load' 
- /usr/bin/mongrel_rails:19 

奇怪的是,我不能在我的(窗口)的開發機重現錯誤,但我只能在我的linux測試服務器上獲得它(2個mongrels,而不是我的機器中的一個)。

怎麼了?我認爲這是一個垃圾收集器問題(在重用它之前收集的對象),但我不明白我在哪裏做錯了什麼。我只是在我的控制器中創建對象並調用一個方法。

有什麼想法?

謝謝! Roberto

+0

您似乎錯過了堆棧跟蹤的實際顯示錯誤的頂部,請問您可以包含該錯誤嗎? – dgtized 2008-11-27 00:41:33

回答

5

此錯誤表示您正在嘗試處理已被垃圾收集的對象,這通常是因爲對象超出了服務器上的作用域而發生。

你最安全的選擇是弄清楚爲什麼物體過早地被垃圾收集。或者,您可以通過調用GC.disable來禁用服務器的GC,這通常是一個壞主意,特別是如果您的服務器長時間運行。

+0

很明顯,如上所述,你應該不禁用GC,但是暫時嘗試這樣做會讓你知道這是否是你的問題 – Almund 2015-09-02 11:14:48

0

是否有可能您在服務器上多次調用DRb.start_service?