README

A Gem for counting the amount of objects that have been allocated but not released yet. Tracking this makes it easier to see if objects are being leaked over time and if so what kind of objects. This Gem does not provide any insight into where objects are being leaked or why.

This Gem can only be used on CRuby, it does not work on Rubinius due to TracePoint not being supported on Rubinius.

Why

The usual approach of getting object counts is by using ObjectSpace.each_object. For example:

counts = Hash.new(0)

ObjectSpace.each_object(Object) do |obj|
  counts[obj.class] += 1
end

Sadly this approach is rather slow (e.g. for GitLab this would take roughly 800 ms) and (seems to) force a garbage collection run after every call. In other words, this isn't something you'd want to run in a production environment.

The allocations Gem on the other hand doesn't suffer from this problem as it counts objects whenever they're allocated and released. This does mean that allocating objects is slightly slower than usual, but the overhead should be small enough to use this Gem in a production environment.

Another big difference between ObjectSpace and this Gem is that the former gives an overview of all currently retained objects whereas the allocations Gem only tracks objects that have been allocated since it was enabled.

Usage

Load the Gem:

require 'allocations'

Enable it:

Allocations.start

Getting a snapshot of the current statistics:

Allocations.to_hash

This will return a Hash with the keys set to various classes and the values to the amount of instances (of each class) that have not yet been released by the garbage collector.

Disable it again and clear any existing statistics:

Allocations.stop

Thread Safety

This C extension does not use any internal locking and instead relies on the GIL to prevent multiple Ruby threads from accessing the allocation data in parallel. Note that calling Allocation.start and Allocations.stop also affects all running threads instead of only the current thread.

License

All source code in this repository is subject to the terms of the MIT license, unless stated otherwise. A copy of this license can be found the file "LICENSE".