@@ -624,34 +624,57 @@ private StaticObject asGuestUsage(MemoryUsage usage, Meta meta) {
624
624
@ TruffleBoundary // Lots of SVM + Windows methods blocked for PE.
625
625
public long GetLongAttribute (@ SuppressWarnings ("unused" ) @ JavaType (Object .class ) StaticObject obj ,
626
626
/* 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 ;
645
667
}
668
+ return hostGCBean .getCollectionTime ();
646
669
}
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
+ }
655
678
}
656
679
getLogger ().warning (() -> "Unknown long attribute: " + att );
657
680
return -1L ;
0 commit comments