[rjb-users] Memory Growth

Chris O'Meara chris at theomearas.net
Tue Feb 5 14:52:46 EST 2008


Hi Everyone,

I spent some time creating a much smaller test case to demonstrate the
problem we're experiencing.

I have a test program, gc_experiment.rb, which creates a bunch of Java
strings, measures the effect of that work on the process rsize and
creates a bunch of Ruby strings and does the same.  The program also
dumps out an object count after each run.

I'll include the test results and the program below.  The results
point to a dramatic growth in rsize after the run with Java strings
but the contents of ObjectSpace look relatively similar between the
two runs.

Just to be thorough, I connected my profiler to the running test
program and checked the heap usage.  Heap size followed the expected
sawtooth pattern when graphed over time and the final usage was < 1mb.

Can anyone help me find my missing memory?

Thanks,
Chris

Test run results:

RSIZE before: 14364; after: 183136
 14189  String
   665  Array
   450  Class
   197  Regexp
   120  Proc
    88  Gem::Version
    82  Gem::Version::Requirement
    68  Module
    50  Range
    44  Gem::Specification
    44  Time
    37  Gem::Dependency
    36  Hash
    18  Float
     6  Object
     5  Gem::Security::Policy
     4  IO
     4  Bignum
     2  Process::Status
     2  Date::Infinity
     2  #<Class:0x513a38>
     2  YAML::Syck::Resolver
     1  Mutex
     1  Binding
     1  Rjb::Java_lang_String
     1  SystemStackError
     1  MatchData
     1  Gem::SourceIndex
     1  Rjb::Java_lang_String$CaseInsensitiveComparator
     1  NoMemoryError
     1  DL::Symbol
     1  Rjb::Java_lang_Class
     1  Thread
     1  fatal
     1  ThreadGroup
     1  Gem::GemPathSearcher
     1  File
     1  LoadError
RSIZE before: 183140; after: 183140
 14213  String
   703  Array
   450  Class
   197  Regexp
   121  Proc
    88  Gem::Version
    82  Gem::Version::Requirement
    68  Module
    50  Range
    44  Gem::Specification
    44  Time
    37  Gem::Dependency
    37  Hash
    18  Float
     6  Object
     5  Gem::Security::Policy
     4  Bignum
     4  IO
     2  YAML::Syck::Resolver
     2  Date::Infinity
     2  Process::Status
     1  Mutex
     1  SystemStackError
     1  Binding
     1  Rjb::Java_lang_String
     1  MatchData
     1  Gem::SourceIndex
     1  NoMemoryError
     1  Rjb::Java_lang_String$CaseInsensitiveComparator
     1  DL::Symbol
     1  fatal
     1  Rjb::Java_lang_Class
     1  Thread
     1  ThreadGroup
     1  File
     1  Gem::GemPathSearcher
     1  #<Class:0x513a38>
     1  LoadError

Test program (gc_experiment.rb):

require 'rubygems'
require 'rjb'

Rjb::load '', [ '-Djava.awt.headless=true', '-Xms8m', '-Xmx16m' ]
# Rjb::load '', [  '-agentlib:yjpagent', '-Djava.awt.headless=true',
'-Xms8m', '-Xmx16m' ]
JString = Rjb::import('java.lang.String')

def process_rsize
 GC.start
 `ps -orss= -p #{Process.pid}`.gsub(/[^0-9]/, '')
end

def report_rsize
 rsize_before = process_rsize
 10000000.times { yield }
 rsize_after = process_rsize
 puts "RSIZE before: #{rsize_before}; after: #{rsize_after}"
end

def report_object_counts
 counts = Hash.new{|h,k| h[k] = 0}
 ObjectSpace.each_object do |o|
   counts[o.class] += 1
 end
 counts.sort_by{|k,c| c}.reverse.each{|k,c| puts '%7d  %s' % [c, k]}
end

report_rsize do
 JString.new_with_sig 'Ljava.lang.String;', 'This is a Java string'
end
report_object_counts

report_rsize do
 String.new 'This is a Ruby string'
end
report_object_counts

# puts 'Hanging around if you want to connect profiler.  Press any key
to contiue.'
# gets


More information about the rjb-users mailing list