Memory
A set of tools for profiling memory in Ruby.
Features
- Fast memory capture for million+ allocations.
- Persist results to disk for vast aggregations and comparisons over time.
Installation
Add this line to your application's Gemfile:
$ bundle add 'memory'
Usage
require 'memory'
report = Memory.report do
# run your code here
end
report.print
Or, you can use the .start
/.stop
methods as well:
require 'memory'
sampler = Memory::Sampler.new
sampler.start
# run your code here
sampler.stop
report = sampler.report
report.print
RSpec Integration
memory_sampler = nil
config.before(:all) do |example_group|
name = example_group.class.description.gsub(/[^\w]+/, '-')
path = "#{name}.mprof"
skip if File.exist?(path)
memory_sampler = Memory::Sampler.new
memory_sampler.start
end
config.after(:all) do |example_group|
name = example_group.class.description.gsub(/[^\w]+/, '-')
path = "#{name}.mprof"
if memory_sampler
memory_sampler.stop
File.open(path, "w", encoding: Encoding::BINARY) do |io|
memory_sampler.dump(io)
end
memory_sampler = nil
end
end
config.after(:suite) do
memory_sampler = Memory::Sampler.new
Dir.glob('*.mprof') do |path|
$stderr.puts "Loading #{path}..."
memory_sampler.load(File.read(path, encoding: Encoding::BINARY))
end
$stderr.puts "Memory usage:"
memory_sampler.report.print
end
Raw Object Allocations
before = nil
config.before(:suite) do |example|
3.times{GC.start}
GC.disable
before = ObjectSpace.count_objects
end
config.after(:suite) do |example|
after = ObjectSpace.count_objects
GC.enable
$stderr.puts
$stderr.puts "Object Allocations:"
after.each do |key, b|
a = before.fetch(key, 0)
$stderr.puts "#{key}: #{a} -> #{b} = #{b-a} allocations"
end
end
Contributing
We welcome contributions to this project.
- Fork it.
- Create your feature branch (
git checkout -b my-new-feature
). - Commit your changes (
git commit -am 'Add some feature'
). - Push to the branch (
git push origin my-new-feature
). - Create new Pull Request.
Developer Certificate of Origin
This project uses the Developer Certificate of Origin. All contributors to this project must agree to this document to have their contributions accepted.
Contributor Covenant
This project is governed by the Contributor Covenant. All contributors and participants agree to abide by its terms.