2424
2525#include " precompiled.hpp"
2626#include " jfr/jfrEvents.hpp"
27- #include " services/memJfrReporter .hpp"
27+ #include " jfr/periodic/jfrNativeMemoryEvent .hpp"
2828#include " services/memTracker.hpp"
2929#include " services/nmtUsage.hpp"
3030#include " utilities/globalDefinitions.hpp"
3131#include " utilities/ticks.hpp"
3232
33- // Helper class to avoid refreshing the NMTUsage to often and allow
34- // the two JFR events to use the same data.
35- class MemJFRCurrentUsage : public AllStatic {
36- private:
37- // The age threshold in milliseconds. If older than this refresh the usage.
38- static const uint64_t AgeThreshold = 50 ;
33+ static NMTUsage* get_usage (const Ticks& timestamp) {
34+ static Ticks last_timestamp;
35+ static NMTUsage* usage = nullptr ;
3936
40- static Ticks _timestamp;
41- static NMTUsage* _usage;
42-
43- public:
44- static NMTUsage* get_usage ();
45- static Ticks get_timestamp ();
46- };
47-
48- Ticks MemJFRCurrentUsage::_timestamp;
49- NMTUsage* MemJFRCurrentUsage::_usage = nullptr ;
50-
51- NMTUsage* MemJFRCurrentUsage::get_usage () {
52- Tickspan since_baselined = Ticks::now () - _timestamp;
53-
54- if (_usage == nullptr ) {
37+ if (usage == nullptr ) {
5538 // First time, create a new NMTUsage.
56- _usage = new NMTUsage (NMTUsage::OptionsNoTS);
57- } else if (since_baselined.milliseconds () < AgeThreshold) {
58- // There is recent enough usage information, return it.
59- return _usage;
39+ usage = new NMTUsage (NMTUsage::OptionsNoTS);
40+ usage->refresh ();
41+ last_timestamp = timestamp;
6042 }
6143
62- // Refresh the usage information.
63- _usage->refresh ();
64- _timestamp.stamp ();
65-
66- return _usage;
67- }
68-
69- Ticks MemJFRCurrentUsage::get_timestamp () {
70- return _timestamp;
44+ if (timestamp != last_timestamp) {
45+ // Refresh usage if new timestamp.
46+ usage->refresh ();
47+ last_timestamp = timestamp;
48+ }
49+ return usage;
7150}
7251
73- void MemJFRReporter ::send_total_event () {
52+ void JfrNativeMemoryEvent ::send_total_event (const Ticks& timestamp ) {
7453 if (!MemTracker::enabled ()) {
7554 return ;
7655 }
7756
78- NMTUsage* usage = MemJFRCurrentUsage::get_usage ();
79- Ticks timestamp = MemJFRCurrentUsage::get_timestamp ();
57+ NMTUsage* usage = get_usage (timestamp);
8058
8159 EventNativeMemoryUsageTotal event (UNTIMED);
8260 event.set_starttime (timestamp);
@@ -85,7 +63,7 @@ void MemJFRReporter::send_total_event() {
8563 event.commit ();
8664}
8765
88- void MemJFRReporter ::send_type_event (const Ticks& starttime, MEMFLAGS flag, size_t reserved, size_t committed) {
66+ void JfrNativeMemoryEvent ::send_type_event (const Ticks& starttime, MEMFLAGS flag, size_t reserved, size_t committed) {
8967 EventNativeMemoryUsage event (UNTIMED);
9068 event.set_starttime (starttime);
9169 event.set_type (NMTUtil::flag_to_index (flag));
@@ -94,13 +72,12 @@ void MemJFRReporter::send_type_event(const Ticks& starttime, MEMFLAGS flag, size
9472 event.commit ();
9573}
9674
97- void MemJFRReporter ::send_type_events () {
75+ void JfrNativeMemoryEvent ::send_type_events (const Ticks& timestamp ) {
9876 if (!MemTracker::enabled ()) {
9977 return ;
10078 }
10179
102- NMTUsage* usage = MemJFRCurrentUsage::get_usage ();
103- Ticks timestamp = MemJFRCurrentUsage::get_timestamp ();
80+ NMTUsage* usage = get_usage (timestamp);
10481
10582 for (int index = 0 ; index < mt_number_of_types; index ++) {
10683 MEMFLAGS flag = NMTUtil::index_to_flag (index);
0 commit comments