Skip to content

Commit e708cef

Browse files
committed
#204 improve gc event detection for G1 event names containing ()
1 parent 1fc85c3 commit e708cef

File tree

4 files changed

+38
-5
lines changed

4 files changed

+38
-5
lines changed

src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderTools.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,15 @@ public ExtendedType parseTypeWithCause(String typeName) {
8282

8383
AbstractGCEvent.Type gcType = AbstractGCEvent.Type.lookup(lookupTypeName);
8484
// the gcType may be null because there was a PrintGCCause flag enabled - if so, reparse it with the first parentheses set stripped
85-
if (gcType == null) {
85+
while (gcType == null && (lookupTypeName.contains("(") && lookupTypeName.contains(")"))) {
8686
// try to parse it again with the parentheses removed
8787
Matcher parenthesesMatcher = parenthesesPattern.matcher(lookupTypeName);
8888
if (parenthesesMatcher.find()) {
89-
gcType = AbstractGCEvent.Type.lookup(parenthesesMatcher.replaceFirst(""));
89+
lookupTypeName = parenthesesMatcher.replaceFirst("");
90+
gcType = AbstractGCEvent.Type.lookup(lookupTypeName);
91+
} else {
92+
// is expected to never happen...
93+
logger.warning("parenthesisMatcher does not match for '" + lookupTypeName + "', allthough string contains '(' + ')'");
9094
}
9195
}
9296

src/main/java/com/tagtraum/perf/gcviewer/model/AbstractGCEvent.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,6 @@ public String toString() {
660660
public static final Type UJL_CMS_CONCURRENT_OLD = new Type("Old", Generation.TENURED, Concurrency.CONCURRENT, GcPattern.GC_MEMORY);
661661

662662
// unified jvm logging g1 event types
663-
public static final Type UJL_G1_PAUSE_YOUNG = new Type("Pause Young (G1 Evacuation Pause)", Generation.YOUNG, Concurrency.SERIAL, GcPattern.GC_MEMORY_PAUSE);
664663
public static final Type UJL_G1_PAUSE_MIXED = new Type("Pause Mixed", Generation.TENURED, Concurrency.SERIAL, GcPattern.GC_MEMORY_PAUSE);
665664
public static final Type UJL_G1_TO_SPACE_EXHAUSTED = new Type("To-space exhausted", Generation.YOUNG, Concurrency.SERIAL, GcPattern.GC);
666665
public static final Type UJL_G1_CONCURRENT_CYCLE = new Type("Concurrent Cycle", Generation.TENURED, Concurrency.CONCURRENT, GcPattern.GC_PAUSE);

src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderUJLG1.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public void testParseGcWithPhases() throws Exception {
221221

222222
assertThat("number of warnings", handler.getCount(), is(0));
223223
assertThat("number of events", model.size(), is(1));
224-
assertThat("event type", model.get(0).getExtendedType().getType(), is(Type.UJL_G1_PAUSE_YOUNG));
224+
assertThat("event type", model.get(0).getExtendedType().getType(), is(Type.UJL_PAUSE_YOUNG));
225225
assertThat("event pause", model.get(0).getPause(), closeTo(0.007033, 0.0000001));
226226

227227
assertThat("phases", model.getGcEventPhases().size(), is(4));

src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderUJLG1JDK11.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import com.tagtraum.perf.gcviewer.UnittestHelper;
1313
import com.tagtraum.perf.gcviewer.UnittestHelper.FOLDER;
14+
import com.tagtraum.perf.gcviewer.model.AbstractGCEvent.Type;
1415
import com.tagtraum.perf.gcviewer.model.GCModel;
1516
import com.tagtraum.perf.gcviewer.model.GCResource;
1617
import com.tagtraum.perf.gcviewer.model.GcResourceFile;
@@ -131,7 +132,36 @@ public void testFullGcWithPhases() throws Exception {
131132
assertThat("number of warnings", handler.getCount(), is(0));
132133
assertThat("number of events", model.size(), is(1));
133134
assertThat("total heap", model.get(0).getTotal(), is(128 * 1024));
134-
135135
}
136136

137+
@Test
138+
public void testPauseYoungConcurrentStartMetadataGcThreshold() throws Exception {
139+
TestLogHandler handler = new TestLogHandler();
140+
handler.setLevel(Level.WARNING);
141+
GCResource gcResource = new GcResourceFile("byteArray");
142+
gcResource.getLogger().addHandler(handler);
143+
InputStream in = new ByteArrayInputStream(
144+
("[1.459s][info][gc,start ] GC(1) Pause Young (Concurrent Start) (Metadata GC Threshold)\n" +
145+
"[1.459s][info][gc,task ] GC(1) Using 8 workers of 8 for evacuation\n" +
146+
"[1.464s][info][gc,phases ] GC(1) Pre Evacuate Collection Set: 0.0ms\n" +
147+
"[1.464s][info][gc,phases ] GC(1) Evacuate Collection Set: 4.1ms\n" +
148+
"[1.464s][info][gc,phases ] GC(1) Post Evacuate Collection Set: 1.1ms\n" +
149+
"[1.464s][info][gc,phases ] GC(1) Other: 0.4ms\n" +
150+
"[1.464s][info][gc,heap ] GC(1) Eden regions: 8->0(38)\n" +
151+
"[1.465s][info][gc,heap ] GC(1) Survivor regions: 3->1(3)\n" +
152+
"[1.465s][info][gc,heap ] GC(1) Old regions: 4->7\n" +
153+
"[1.465s][info][gc,heap ] GC(1) Humongous regions: 5->5\n" +
154+
"[1.465s][info][gc,metaspace ] GC(1) Metaspace: 20599K->20599K(1069056K)\n" +
155+
"[1.465s][info][gc ] GC(1) Pause Young (Concurrent Start) (Metadata GC Threshold) 19M->12M(256M) 5.774ms\n" +
156+
"[1.465s][info][gc,cpu ] GC(1) User=0.03s Sys=0.00s Real=0.00s\n")
157+
.getBytes());
158+
159+
DataReader reader = new DataReaderUnifiedJvmLogging(gcResource, in);
160+
GCModel model = reader.read();
161+
162+
assertThat("number of warnings", handler.getCount(), is(0));
163+
assertThat("number of events", model.size(), is(1));
164+
assertThat("event type", model.get(0).getExtendedType().getType(), is(Type.UJL_PAUSE_YOUNG));
165+
assertThat("total heap", model.get(0).getTotal(), is(256 * 1024));
166+
}
137167
}

0 commit comments

Comments
 (0)