15
15
import java .lang .management .MemoryUsage ;
16
16
import java .time .Duration ;
17
17
18
+ import com .oracle .truffle .api .dsl .Cached ;
19
+ import org .jcodings .specific .UTF8Encoding ;
18
20
import org .truffleruby .SuppressFBWarnings ;
19
21
import org .truffleruby .builtins .CoreMethod ;
20
22
import org .truffleruby .builtins .CoreMethodArrayArgumentsNode ;
26
28
import org .truffleruby .builtins .PrimitiveArrayArgumentsNode ;
27
29
import org .truffleruby .collections .WeakValueCache ;
28
30
import org .truffleruby .core .array .RubyArray ;
31
+ import org .truffleruby .core .rope .CodeRange ;
32
+ import org .truffleruby .core .string .StringNodes ;
29
33
import org .truffleruby .language .SafepointManager ;
30
34
import org .truffleruby .language .control .RaiseException ;
31
35
@@ -135,7 +139,8 @@ public static abstract class GCStatPrimitiveNode extends PrimitiveArrayArguments
135
139
136
140
@ TruffleBoundary
137
141
@ Specialization
138
- protected RubyArray stat () {
142
+ protected RubyArray stat (
143
+ @ Cached StringNodes .MakeStringNode makeStringNode ) {
139
144
long time = 0 ;
140
145
int count = 0 ;
141
146
int minorCount = 0 ;
@@ -173,13 +178,12 @@ protected RubyArray stat() {
173
178
174
179
// Get memory usage values from relevant memory pools (2-3 / ~8 are relevant)
175
180
memoryPools = new Object [memoryPoolNames .length ];
176
- for (MemoryPoolMXBean bean : ManagementFactory .getMemoryPoolMXBeans ()) {
177
- if (bean .getName ().equals (memoryPoolNames [0 ])) {
178
- memoryPools [0 ] = beanToArray (bean );
179
- } else if (bean .getName ().equals (memoryPoolNames [1 ])) {
180
- memoryPools [1 ] = beanToArray (bean );
181
- } else if (memoryPoolNames .length == 3 && bean .getName ().equals (memoryPoolNames [2 ])) {
182
- memoryPools [2 ] = beanToArray (bean );
181
+ for (int i = 0 ; i < memoryPoolNames .length ; i ++) {
182
+ String memoryPoolName = memoryPoolNames [i ];
183
+ for (MemoryPoolMXBean bean : ManagementFactory .getMemoryPoolMXBeans ()) {
184
+ if (bean .getName ().equals (memoryPoolName )) {
185
+ memoryPools [i ] = beanToArray (bean );
186
+ }
183
187
}
184
188
}
185
189
@@ -188,7 +192,8 @@ protected RubyArray stat() {
188
192
// Use an object array instead because otherwise ArrayHelpers.java line 51 complains
189
193
Object [] memoryPoolNamesCast = new Object [memoryPoolNames .length ];
190
194
for (int i = 0 ; i < memoryPoolNames .length ; i ++) {
191
- memoryPoolNamesCast [i ] = memoryPoolNames [i ];
195
+ memoryPoolNamesCast [i ] = makeStringNode
196
+ .executeMake (memoryPoolNames [i ], UTF8Encoding .INSTANCE , CodeRange .CR_UNKNOWN );
192
197
}
193
198
194
199
@@ -205,16 +210,24 @@ protected RubyArray stat() {
205
210
createArray (memoryPools ) });
206
211
}
207
212
208
- protected RubyArray usageToArray (MemoryUsage usage ) {
209
- return createArray (new Object []{ usage .getCommitted (), usage .getInit (), usage .getMax (), usage .getUsed () });
210
- }
211
-
212
213
protected RubyArray beanToArray (MemoryPoolMXBean bean ) {
214
+ MemoryUsage usage = bean .getUsage ();
215
+ MemoryUsage peak = bean .getPeakUsage ();
216
+ MemoryUsage last = bean .getCollectionUsage ();
213
217
return createArray (
214
- new Object []{
215
- usageToArray (bean .getUsage ()),
216
- usageToArray (bean .getPeakUsage ()),
217
- usageToArray (bean .getCollectionUsage ()) });
218
+ new long []{
219
+ usage .getCommitted (),
220
+ usage .getInit (),
221
+ usage .getMax (),
222
+ usage .getUsed (),
223
+ peak .getCommitted (),
224
+ peak .getInit (),
225
+ peak .getMax (),
226
+ peak .getUsed (),
227
+ last .getCommitted (),
228
+ last .getInit (),
229
+ last .getMax (),
230
+ last .getUsed () });
218
231
}
219
232
220
233
}
0 commit comments