forked from rubinius/rubinius
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgc.rb
137 lines (111 loc) · 2.95 KB
/
gc.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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