From b8d8a42f2e0fa1740879706e5db1243bd6a2c359 Mon Sep 17 00:00:00 2001 From: Denghui Dong Date: Fri, 31 Jul 2020 13:18:14 +0800 Subject: [PATCH] [JFR] Added SafepointStatistics and HugeObjectAllocationSample Events Summary: SafepointStatistics is a periodic event, both events are experimental now and disbaled by default Test Plan: jdk/test/jdk/jfr/event/runtime/TestSafepointEvents.java jdk/test/jdk/jfr/event/compiler/TestHugeObjectAllocationSample.java jdk/test/jdk/jfr/event/metadata/TestLookForUntestedEvents.java Reviewed-by: kuaiwei Issue: https://github.com/alibaba/dragonwell8/issues/116 --- src/share/vm/gc_interface/allocTracer.cpp | 8 ++++++++ src/share/vm/jfr/metadata/metadata.xml | 14 ++++++++++++++ src/share/vm/jfr/periodic/jfrPeriodic.cpp | 12 ++++++++++++ src/share/vm/runtime/globals_ext.hpp | 4 ++++ src/share/vm/runtime/safepoint.hpp | 8 ++++++++ src/share/vm/utilities/globalDefinitions.hpp | 4 ++++ 6 files changed, 50 insertions(+) diff --git a/src/share/vm/gc_interface/allocTracer.cpp b/src/share/vm/gc_interface/allocTracer.cpp index acb731f20..7811221e5 100644 --- a/src/share/vm/gc_interface/allocTracer.cpp +++ b/src/share/vm/gc_interface/allocTracer.cpp @@ -40,6 +40,14 @@ void AllocTracer::send_allocation_outside_tlab_event(KlassHandle klass, HeapWord event.set_allocationSize(alloc_size); event.commit(); } + if (alloc_size >= HugeObjectAllocationThreshold) { + EventHugeObjectAllocationSample hoas_event; + if (hoas_event.should_commit()) { + hoas_event.set_objectClass(klass()); + hoas_event.set_allocationSize(alloc_size); + hoas_event.commit(); + } + } } void AllocTracer::send_allocation_in_new_tlab_event(KlassHandle klass, HeapWord* obj, size_t tlab_size, size_t alloc_size, Thread* thread) { diff --git a/src/share/vm/jfr/metadata/metadata.xml b/src/share/vm/jfr/metadata/metadata.xml index d5bcc1913..359b095b8 100644 --- a/src/share/vm/jfr/metadata/metadata.xml +++ b/src/share/vm/jfr/metadata/metadata.xml @@ -512,6 +512,15 @@ + + + + + + + + + @@ -575,6 +584,11 @@ + + + + + diff --git a/src/share/vm/jfr/periodic/jfrPeriodic.cpp b/src/share/vm/jfr/periodic/jfrPeriodic.cpp index e3add031d..67a6d614c 100644 --- a/src/share/vm/jfr/periodic/jfrPeriodic.cpp +++ b/src/share/vm/jfr/periodic/jfrPeriodic.cpp @@ -55,6 +55,7 @@ #include "runtime/vmThread.hpp" #include "services/classLoadingService.hpp" #include "services/management.hpp" +#include "services/runtimeService.hpp" #include "services/threadService.hpp" #include "utilities/exceptions.hpp" #include "utilities/globalDefinitions.hpp" @@ -558,3 +559,14 @@ TRACE_REQUEST_FUNC(CodeSweeperConfiguration) { event.set_flushingEnabled(UseCodeCacheFlushing); event.commit(); } + +TRACE_REQUEST_FUNC(SafepointStatistics) { + EventSafepointStatistics event; + event.set_totalCount(RuntimeService::safepoint_count()); + event.set_syncTime(RuntimeService::safepoint_sync_time_ms()); + event.set_safepointTime(RuntimeService::safepoint_time_ms()); + event.set_applicationTime(RuntimeService::application_time_ms()); + event.set_maxSyncTime(SafepointSynchronize::max_sync_time_ms()); + event.set_maxVMOperatoinTime(SafepointSynchronize::max_vmop_time_ms()); + event.commit(); +} diff --git a/src/share/vm/runtime/globals_ext.hpp b/src/share/vm/runtime/globals_ext.hpp index 74643c1d1..1b215ebf0 100644 --- a/src/share/vm/runtime/globals_ext.hpp +++ b/src/share/vm/runtime/globals_ext.hpp @@ -132,6 +132,10 @@ \ manageable(bool, PrintThreadCoroutineInfo, false, \ "print the park/unpark information for thread coroutine") \ + \ + manageable(uintx, HugeObjectAllocationThreshold, 128*M, \ + "The size of the used heap of the instance must occupy to " \ + "generate a jfr event") \ //add new AJVM specific flags here diff --git a/src/share/vm/runtime/safepoint.hpp b/src/share/vm/runtime/safepoint.hpp index 123593044..d72b19817 100644 --- a/src/share/vm/runtime/safepoint.hpp +++ b/src/share/vm/runtime/safepoint.hpp @@ -188,6 +188,14 @@ public: static address address_of_state() { return (address)&_state; } static address safepoint_counter_addr() { return (address)&_safepoint_counter; } + + static jlong max_sync_time_ms() { + return nanos_to_millis(_max_sync_time); + } + + static jlong max_vmop_time_ms() { + return nanos_to_millis(_max_vmop_time); + } }; // State class for a thread suspended at a safepoint diff --git a/src/share/vm/utilities/globalDefinitions.hpp b/src/share/vm/utilities/globalDefinitions.hpp index cdb1fdc0f..12974641c 100644 --- a/src/share/vm/utilities/globalDefinitions.hpp +++ b/src/share/vm/utilities/globalDefinitions.hpp @@ -219,6 +219,10 @@ const int NANOUNITS = 1000000000; // nano units per base unit const jlong NANOSECS_PER_SEC = CONST64(1000000000); const jint NANOSECS_PER_MILLISEC = 1000000; +inline int64_t nanos_to_millis(int64_t nanos) { + return nanos / NANOSECS_PER_MILLISEC; +} + // Proper units routines try to maintain at least three significant digits. // In worst case, it would print five significant digits with lower prefix. // G is close to MAX_SIZE on 32-bit platforms, so its product can easily overflow, -- GitLab