|
25 | 25 | package som.primitives;
|
26 | 26 |
|
27 | 27 | import java.io.IOException;
|
| 28 | +import java.lang.management.GarbageCollectorMXBean; |
| 29 | +import java.lang.management.ManagementFactory; |
28 | 30 | import java.nio.file.Files;
|
29 | 31 | import java.nio.file.Path;
|
30 | 32 | import java.nio.file.Paths;
|
| 33 | +import java.util.List; |
31 | 34 |
|
| 35 | +import com.sun.management.ThreadMXBean; |
32 | 36 | import som.compiler.ProgramDefinitionError;
|
33 | 37 | import som.interpreter.Frame;
|
34 | 38 | import som.interpreter.Interpreter;
|
35 | 39 | import som.vm.Universe;
|
36 | 40 | import som.vmobjects.SAbstractObject;
|
| 41 | +import som.vmobjects.SArray; |
37 | 42 | import som.vmobjects.SClass;
|
38 | 43 | import som.vmobjects.SInteger;
|
39 | 44 | import som.vmobjects.SPrimitive;
|
@@ -162,6 +167,42 @@ public void invoke(final Frame frame, final Interpreter interpreter) {
|
162 | 167 | }
|
163 | 168 | });
|
164 | 169 |
|
| 170 | + installInstancePrimitive(new SPrimitive("gcStats", universe) { |
| 171 | + |
| 172 | + @Override |
| 173 | + public void invoke(Frame frame, Interpreter interpreter) { |
| 174 | + frame.pop(); |
| 175 | + |
| 176 | + final List<GarbageCollectorMXBean> gcBeans = |
| 177 | + ManagementFactory.getGarbageCollectorMXBeans(); |
| 178 | + final ThreadMXBean threadBean = (ThreadMXBean) ManagementFactory.getThreadMXBean(); |
| 179 | + threadBean.setThreadAllocatedMemoryEnabled(true); |
| 180 | + |
| 181 | + final long allocatedBytes = threadBean.getCurrentThreadAllocatedBytes(); |
| 182 | + long counts = 0; |
| 183 | + long time = 0; |
| 184 | + |
| 185 | + for (GarbageCollectorMXBean b : gcBeans) { |
| 186 | + long c = b.getCollectionCount(); |
| 187 | + if (c != -1) { |
| 188 | + counts += c; |
| 189 | + } |
| 190 | + |
| 191 | + long t = b.getCollectionTime(); |
| 192 | + if (t != -1) { |
| 193 | + time += t; |
| 194 | + } |
| 195 | + } |
| 196 | + |
| 197 | + final SArray arr = new SArray(universe.nilObject, 3L); |
| 198 | + arr.setIndexableField(0L, SInteger.getInteger(counts)); |
| 199 | + arr.setIndexableField(1L, SInteger.getInteger(time)); |
| 200 | + arr.setIndexableField(2L, SInteger.getInteger(allocatedBytes)); |
| 201 | + |
| 202 | + frame.push(arr); |
| 203 | + } |
| 204 | + }); |
| 205 | + |
165 | 206 | installInstancePrimitive(new SPrimitive("loadFile:", universe) {
|
166 | 207 |
|
167 | 208 | @Override
|
|
0 commit comments