core/gc.rb
module GC
def self.start
run(false)
end
def self.run(force)
Rubinius.primitive :vm_gc_start
raise PrimitiveFailure, "GC.run primitive failed"
end
# Totally fake.
def self.stress
@stress_level ||= false
end
# Totally fake.
def self.stress=(flag)
@stress_level = !!flag
end
# Totally fake.
@enabled = true
def self.enable
# We don't support disable, so sure! enabled!
ret = !@enabled
@enabled = true
return ret
end
# Totally fake.
def self.disable
# Treat this like a request that we don't honor.
ret = !@enabled
@enabled = false
return ret
end
def garbage_collect
GC.start
end
def self.count
if data = stat
data[:"gc.young.count"] + data[:"gc.immix.count"]
else
0
end
end
def self.time
if data = stat
data[:"gc.young.ms"] +
data[:"gc.immix.stop.ms"] +
data[:"gc.large.sweep.us"] * 1_000
else
0
end
end
def self.stat
if Rubinius::Metrics.enabled?
return Rubinius::Metrics.data.to_hash
end
end
module Profiler
@enabled = true
@since = 0
def self.clear
@since = GC.time
nil
end
def self.disable
# Treat this like a request that we don't honor.
ret = !@enabled
@enabled = false
ret
end
def self.enable
# We don't support disable, so sure! enabled!
ret = !@enabled
@enabled = true
ret
end
def self.enabled?
@enabled
end
def self.report(out = $stdout)
out.write result
end
def self.result
unless Rubinius::Metrics.enabled?
return "Rubinius::Metrics is disabled. GC::Profiler results are unavailable"
end
stats = GC.stat
out = <<-OUT
Complete process runtime statistics
===================================
Collections
Count Total time / concurrent (ms)
Young #{sprintf("% 22d", stats[:'gc.young.count'])} #{sprintf("% 16d ", stats[:'gc.young.ms'])}
Full #{sprintf("% 22d", stats[:'gc.immix.count'])} #{sprintf("% 16d / % 10d", stats[:'gc.immix.stop.ms'], stats[:'gc.immix.concurrent.ms'])}
Allocation
Objects allocated Bytes allocated
Young #{sprintf("% 22d", stats[:'memory.young.objects'])} #{sprintf("% 22d", stats[:'memory.young.bytes'])}
Promoted#{sprintf("% 22d", stats[:'memory.promoted.objects'])} #{sprintf("% 22d", stats[:'memory.promoted.bytes'])}
Mature #{sprintf("% 22d", stats[:'memory.immix.objects'])} #{sprintf("% 22d", stats[:'memory.immix.bytes'])}
Usage
Bytes used
Young #{sprintf("% 22d", stats[:'memory.young.bytes'])}
Mature #{sprintf("% 22d", stats[:'memory.immix.bytes'])}
Large #{sprintf("% 22d", stats[:'memory.large.bytes'])}
Code #{sprintf("% 22d", stats[:'memory.code.bytes'])}
Symbols #{sprintf("% 22d", stats[:'memory.symbols.bytes'])}
OUT
end
def self.total_time
(GC.time - @since) / 1000.0
end
end
end