Skip to content

Commit e11f70a

Browse files
committed
8003216: Add JFR event indicating explicit System.gc() call
Reviewed-by: jbachorik, mgronlun, tschatzl
1 parent 2b41459 commit e11f70a

File tree

6 files changed

+99
-0
lines changed

6 files changed

+99
-0
lines changed

src/hotspot/share/jfr/metadata/metadata.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,10 @@
278278
<Field type="Tickspan" name="longestPause" label="Longest Pause" description="Longest individual pause during the garbage collection" />
279279
</Event>
280280

281+
<Event name="SystemGC" category="Java Virtual Machine, GC, Collector" label="System GC" stackTrace="true" startTime="true" thread="true">
282+
<Field type="boolean" name="invokedConcurrent" label="Invoked Concurrent" />
283+
</Event>
284+
281285
<Event name="ParallelOldGarbageCollection" category="Java Virtual Machine, GC, Collector" label="Parallel Old Garbage Collection"
282286
description="Extra information specific to Parallel Old Garbage Collections">
283287
<Field type="uint" name="gcId" label="GC Identifier" relation="GcId" />

src/hotspot/share/prims/jvm.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,10 @@ JVM_END
443443

444444
JVM_ENTRY_NO_ENV(void, JVM_GC(void))
445445
if (!DisableExplicitGC) {
446+
EventSystemGC event;
447+
event.set_invokedConcurrent(ExplicitGCInvokesConcurrent);
446448
Universe::heap()->collect(GCCause::_java_lang_system_gc);
449+
event.commit();
447450
}
448451
JVM_END
449452

src/jdk.jfr/share/conf/jfr/default.jfc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,12 @@
346346
<setting name="threshold">0 ms</setting>
347347
</event>
348348

349+
<event name="jdk.SystemGC">
350+
<setting name="enabled">true</setting>
351+
<setting name="threshold">0 ms</setting>
352+
<setting name="stackTrace">true</setting>
353+
</event>
354+
349355
<event name="jdk.ParallelOldGarbageCollection">
350356
<setting name="enabled" control="gc-enabled-normal">true</setting>
351357
<setting name="threshold">0 ms</setting>

src/jdk.jfr/share/conf/jfr/profile.jfc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,12 @@
346346
<setting name="threshold">0 ms</setting>
347347
</event>
348348

349+
<event name="jdk.SystemGC">
350+
<setting name="enabled">true</setting>
351+
<setting name="threshold">0 ms</setting>
352+
<setting name="stackTrace">true</setting>
353+
</event>
354+
349355
<event name="jdk.ParallelOldGarbageCollection">
350356
<setting name="enabled" control="gc-enabled-normal">true</setting>
351357
<setting name="threshold">0 ms</setting>
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
26+
package jdk.jfr.event.gc.collection;
27+
28+
import java.lang.management.ManagementFactory;
29+
import java.util.List;
30+
31+
import jdk.jfr.Recording;
32+
import jdk.jfr.consumer.RecordedEvent;
33+
import jdk.test.lib.Asserts;
34+
import jdk.test.lib.jfr.EventNames;
35+
import jdk.test.lib.jfr.Events;
36+
37+
/**
38+
* @test
39+
* @key jfr
40+
* @requires vm.hasJFR
41+
* @library /test/lib /test/jdk
42+
* @run main/othervm -XX:+ExplicitGCInvokesConcurrent jdk.jfr.event.gc.collection.TestSystemGC true
43+
* @run main/othervm -XX:-ExplicitGCInvokesConcurrent jdk.jfr.event.gc.collection.TestSystemGC false
44+
*/
45+
public class TestSystemGC {
46+
public static void main(String[] args) throws Exception {
47+
boolean concurrent = Boolean.valueOf(args[0]);
48+
try (Recording recording = new Recording()) {
49+
recording.enable(EventNames.SystemGC);
50+
recording.start();
51+
52+
// Trigger 3 System GC
53+
System.gc();
54+
ManagementFactory.getMemoryMXBean().gc();
55+
Runtime.getRuntime().gc();
56+
57+
recording.stop();
58+
List<RecordedEvent> events = Events.fromRecording(recording);
59+
System.out.println(events);
60+
61+
Asserts.assertEquals(3, events.size(), "Expected 3 SystemGC events");
62+
63+
RecordedEvent event1 = events.get(0);
64+
Events.assertFrame(event1, System.class, "gc");
65+
Events.assertEventThread(event1, Thread.currentThread());
66+
Events.assertField(event1, "invokedConcurrent").isEqual(concurrent);
67+
68+
RecordedEvent event2 = events.get(1);
69+
Events.assertFrame(event2, Runtime.class, "gc");
70+
Events.assertEventThread(event2, Thread.currentThread());
71+
Events.assertField(event1, "invokedConcurrent").isEqual(concurrent);
72+
73+
RecordedEvent event3 = events.get(2);
74+
// MemoryMXBean.class is an interface so can't assertFrame on it
75+
Events.assertEventThread(event3, Thread.currentThread());
76+
Events.assertField(event1, "invokedConcurrent").isEqual(concurrent);
77+
}
78+
}
79+
}

test/lib/jdk/test/lib/jfr/EventNames.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ public class EventNames {
150150
public final static String ZUncommit = PREFIX + "ZUncommit";
151151
public final static String ZUnmap = PREFIX + "ZUnmap";
152152
public final static String GCLocker = PREFIX + "GCLocker";
153+
public static final String SystemGC = PREFIX + "SystemGC";
153154

154155
// Compiler
155156
public final static String Compilation = PREFIX + "Compilation";

0 commit comments

Comments
 (0)