Skip to content

Commit c81f44c

Browse files
[GR-55731] Management: implement JMM_GC_TIME_MS and JMM_GC_COUNT.
PullRequest: graal/18385
2 parents 0413eba + 15ebd1a commit c81f44c

File tree

1 file changed

+49
-26
lines changed
  • espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/vm

1 file changed

+49
-26
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/vm/Management.java

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -624,34 +624,57 @@ private StaticObject asGuestUsage(MemoryUsage usage, Meta meta) {
624624
@TruffleBoundary // Lots of SVM + Windows methods blocked for PE.
625625
public long GetLongAttribute(@SuppressWarnings("unused") @JavaType(Object.class) StaticObject obj,
626626
/* jmmLongAttribute */ int att) {
627-
switch (att) {
628-
case JMM_JVM_INIT_DONE_TIME_MS:
629-
return TimeUnit.NANOSECONDS.toMillis(getContext().initDoneTimeNanos);
630-
case JMM_CLASS_LOADED_COUNT:
631-
return getRegistries().getLoadedClassesCount();
632-
case JMM_CLASS_UNLOADED_COUNT:
633-
return 0L;
634-
case JMM_JVM_UPTIME_MS:
635-
long elapsedNanos = System.nanoTime() - getContext().initDoneTimeNanos;
636-
return TimeUnit.NANOSECONDS.toMillis(elapsedNanos);
637-
case JMM_OS_PROCESS_ID:
638-
return ProcessHandle.current().pid();
639-
case JMM_THREAD_DAEMON_COUNT:
640-
int daemonCount = 0;
641-
ThreadsAccess threadAccess = getContext().getThreadAccess();
642-
for (StaticObject t : getContext().getActiveThreads()) {
643-
if (threadAccess.isDaemon(t)) {
644-
++daemonCount;
627+
if (StaticObject.isNull(obj)) {
628+
switch (att) {
629+
case JMM_JVM_INIT_DONE_TIME_MS:
630+
return TimeUnit.NANOSECONDS.toMillis(getContext().initDoneTimeNanos);
631+
case JMM_CLASS_LOADED_COUNT:
632+
return getRegistries().getLoadedClassesCount();
633+
case JMM_CLASS_UNLOADED_COUNT:
634+
return 0L;
635+
case JMM_JVM_UPTIME_MS:
636+
long elapsedNanos = System.nanoTime() - getContext().initDoneTimeNanos;
637+
return TimeUnit.NANOSECONDS.toMillis(elapsedNanos);
638+
case JMM_OS_PROCESS_ID:
639+
return ProcessHandle.current().pid();
640+
case JMM_THREAD_DAEMON_COUNT:
641+
int daemonCount = 0;
642+
ThreadsAccess threadAccess = getContext().getThreadAccess();
643+
for (StaticObject t : getContext().getActiveThreads()) {
644+
if (threadAccess.isDaemon(t)) {
645+
++daemonCount;
646+
}
647+
}
648+
return daemonCount;
649+
case JMM_THREAD_PEAK_COUNT:
650+
return getContext().getPeakThreadCount();
651+
case JMM_THREAD_LIVE_COUNT:
652+
return getContext().getActiveThreads().length;
653+
case JMM_THREAD_TOTAL_COUNT:
654+
return getContext().getCreatedThreadCount();
655+
}
656+
} else {
657+
MemoryManagerMXBean hostBean = reverseMemoryManagers.get(obj);
658+
if (hostBean == null) {
659+
LOGGER.warning(() -> "Unknown guest memory manager for object of type " + obj.getKlass());
660+
return -1L;
661+
}
662+
switch (att) {
663+
case JMM_GC_TIME_MS: {
664+
if (!(hostBean instanceof GarbageCollectorMXBean hostGCBean)) {
665+
LOGGER.warning(() -> "Not a GC bean, got a " + hostBean.getClass());
666+
return -1L;
645667
}
668+
return hostGCBean.getCollectionTime();
646669
}
647-
return daemonCount;
648-
649-
case JMM_THREAD_PEAK_COUNT:
650-
return getContext().getPeakThreadCount();
651-
case JMM_THREAD_LIVE_COUNT:
652-
return getContext().getActiveThreads().length;
653-
case JMM_THREAD_TOTAL_COUNT:
654-
return getContext().getCreatedThreadCount();
670+
case JMM_GC_COUNT: {
671+
if (!(hostBean instanceof GarbageCollectorMXBean hostGCBean)) {
672+
LOGGER.warning(() -> "Not a GC bean, got a " + hostBean.getClass());
673+
return -1L;
674+
}
675+
return hostGCBean.getCollectionCount();
676+
}
677+
}
655678
}
656679
getLogger().warning(() -> "Unknown long attribute: " + att);
657680
return -1L;

0 commit comments

Comments
 (0)