Sha256: df6e81a93b54daf7b369fa7aad0e6d4a637a5bce751a6ea7e8553e3bb19ed1d3
Contents?: true
Size: 1.64 KB
Versions: 2
Compression:
Stored size: 1.64 KB
Contents
# encoding: utf-8 # This file is distributed under New Relic's license terms. # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details. # The GC::Profiler class available on MRI has to be reset periodically to avoid # memory "leaking" in the underlying implementation. However, it's a major # bummer for how we want to gather those statistics. # # This class comes to the rescue. It relies on being the only party to reset # the underlying GC::Profiler, but otherwise gives us a steadily increasing # total time. module NewRelic module Agent module VM class MonotonicGCProfiler def initialize @total_time_s = 0 @lock = Mutex.new end class ProfilerNotEnabledError < StandardError def initialize super("total_time is not available if GC::Profiler isn't enabled") end end def total_time_s raise ProfilerNotEnabledError.new unless NewRelic::LanguageSupport.gc_profiler_enabled? # There's a race here if the next two lines don't execute as an atomic # unit - we may end up double-counting some GC time in that scenario. # Locking around them guarantees atomicity of the read/increment/reset # sequence. @lock.synchronize do # The Ruby 1.9.x docs claim that GC::Profiler.total_time returns # a value in milliseconds. They are incorrect - both 1.9.x and 2.x # return values in seconds. @total_time_s += ::GC::Profiler.total_time ::GC::Profiler.clear end @total_time_s end end end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
newrelic_rpm-3.8.1.221 | lib/new_relic/agent/vm/monotonic_gc_profiler.rb |
newrelic_rpm-3.8.0.218 | lib/new_relic/agent/vm/monotonic_gc_profiler.rb |