Sha256: b46e88e7d05da28d518661f17abcb9b283aaec355376759ef963a54ac337c564

Contents?: true

Size: 1.62 KB

Versions: 66

Compression:

Stored size: 1.62 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

        def total_time_s
          if 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
          else
            NewRelic::Agent.logger.log_once(:warn, :gc_profiler_disabled,
              "Tried to measure GC time, but GC::Profiler was not enabled.")
          end

          @total_time_s
        end
      end
    end
  end
end

Version data entries

66 entries across 66 versions & 2 rubygems

Version Path
newrelic_rpm-4.8.0.341 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-4.7.1.340 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-4.7.0.339 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-4.6.0.338 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-4.5.0.337 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-4.4.0.336 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-4.3.0.335 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-4.2.0.334 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-4.1.0.333 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-4.0.0.332 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-3.18.1.330 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-3.18.0.329 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-3.17.2.327 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-3.17.1.326 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-3.17.0.325 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-3.16.3.323 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-3.16.2.321 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-3.16.1.320 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
newrelic_rpm-3.16.0.318 lib/new_relic/agent/vm/monotonic_gc_profiler.rb
ish_lib_manager-0.0.1 test/dummy/vendor/bundle/ruby/2.3.0/gems/newrelic_rpm-3.15.2.317/lib/new_relic/agent/vm/monotonic_gc_profiler.rb