Skip to content

Commit b13e93f

Browse files
authored
Add gcStats system primitive (#35)
2 parents bfcddf5 + c71acc0 commit b13e93f

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

src/som/primitives/SystemPrimitives.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,20 @@
2525
package som.primitives;
2626

2727
import java.io.IOException;
28+
import java.lang.management.GarbageCollectorMXBean;
29+
import java.lang.management.ManagementFactory;
2830
import java.nio.file.Files;
2931
import java.nio.file.Path;
3032
import java.nio.file.Paths;
33+
import java.util.List;
3134

35+
import com.sun.management.ThreadMXBean;
3236
import som.compiler.ProgramDefinitionError;
3337
import som.interpreter.Frame;
3438
import som.interpreter.Interpreter;
3539
import som.vm.Universe;
3640
import som.vmobjects.SAbstractObject;
41+
import som.vmobjects.SArray;
3742
import som.vmobjects.SClass;
3843
import som.vmobjects.SInteger;
3944
import som.vmobjects.SPrimitive;
@@ -162,6 +167,42 @@ public void invoke(final Frame frame, final Interpreter interpreter) {
162167
}
163168
});
164169

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+
165206
installInstancePrimitive(new SPrimitive("loadFile:", universe) {
166207

167208
@Override

0 commit comments

Comments
 (0)