Hey,
We recently spotted strange behavior with Rails 2.3. For some reason last 3
requests/responses (and all connected objects - controller, views,
controller's instance variables, etc) are always present in memory in
_production_ mode.
This is how we see the problem. Create an empty Rails application with a
simple controller like this:
=== app/controllers/default_controller.rb ===
class A
end
class DefaultController < ApplicationController
def index
@a = A.new
GC.start
x = 0
ObjectSpace.each_object(A) do |o|
x+=1
end
puts x
render :text => "Hello!"
end
end
Now launch the application (in a production mode) and perform requests.
You'll see that:
- after first request: there's one object of class A in memory
- after second request: there're two objects of class A in memory!!!
- after third request: there're three objects of class A in memory!!!
- after Nth request: there're still three objects of class A in
memory!!!
The complete log output will look like this:
=================================================
=> Booting WEBrick
=> Rails 2.3.5 application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-05-14 16:25:18] INFO WEBrick 1.3.1
[2010-05-14 16:25:18] INFO ruby 1.8.7 (2010-01-10) [i486-linux]
[2010-05-14 16:25:23] INFO WEBrick::HTTPServer#start: pid=22164 port=3000
1
Processing DefaultController#index (for 127.0.0.1 at 2010-05-14
16:25:24) [GET]
Completed in 29ms (View: 3 | 200 OK [http://localhost/default/index]
2
Processing DefaultController#index (for 127.0.0.1 at 2010-05-14
16:25:28) [GET]
Completed in 19ms (View: 0 | 200 OK [http://localhost/default/index]
3
Processing DefaultController#index (for 127.0.0.1 at 2010-05-14
16:25:31) [GET]
Completed in 20ms (View: 1 | 200 OK [http://localhost/default/index]
3
Processing DefaultController#index (for 127.0.0.1 at 2010-05-14
16:25:34) [GET]
Completed in 18ms (View: 1 | 200 OK [http://localhost/default/index]
3
=================================================
I'd expect to have only one object of class A in memory because after the
request ends and the new one starts nothing should hold a reference to it. And
we explicitly call GC.start before checking the objectspace.
Also, if you replace
ObjectSpace.each_object(A) do |o|
with
ObjectSpace.each_object(ActionController::Response) do |o|
you'll see the same result, you'll get 3 responses in objectspace.
So, the questions are:
- who might hold 3 references to last 3 requests/responses?
- how can I debug this? how can I find that reference?
- can this be something related to rack?
--
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Core" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-core?hl=en.