From fbc94e20e5944163aa0d9bb2487276bef1d64985 Mon Sep 17 00:00:00 2001 From: zhaixiang Date: Thu, 28 Jul 2022 11:35:13 +0800 Subject: [PATCH 1/6] Support to parse PrintGCID https://github.com/chewiebug/GCViewer/is197sues/197 --- .../gcviewer/imp/AbstractDataReaderSun.java | 27 +++++++++++++++++++ .../perf/gcviewer/imp/DataReaderSun1_6_0.java | 1 + 2 files changed, 28 insertions(+) diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java index 8d0004af..8de97d72 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java @@ -301,6 +301,33 @@ protected String parseTypeString(String line, ParseInformation pos) throws Parse } } + protected void parseId(String line, ParseInformation pos) throws ParseException { + if (!line.contains("#")) + return; + int i = pos.getIndex(); + try { + // consume all leading spaces and # + final int lineLength = line.length(); + final char[] lineChars = line.toCharArray(); + char c = lineChars[i]; + for (; i < lineLength; c = lineChars[++i]) { + if (c != ' ' && c != '#') break; + } + if (i >= lineLength) + throw new ParseException("Unexpected end of line.", line); + // check whether the type name starts with a number + // -> skip number + for (; Character.isDigit(c) && i < lineLength; c = lineChars[++i]); + // -> skip : + for (; i parseLine(String line, ParseInformation pos) throws // pre-used->post-used, total, time ZonedDateTime datestamp = parseDatestamp(line, pos); double timestamp = getTimestamp(line, pos, datestamp); + parseId(line, pos); ExtendedType type = parseType(line, pos); AbstractGCEvent ae; if (type.getConcurrency() == Concurrency.CONCURRENT) { From 606b6403edb0dcf039e3fe4e3ca4a23aed79fd03 Mon Sep 17 00:00:00 2001 From: zhaixiang Date: Thu, 28 Jul 2022 11:44:22 +0800 Subject: [PATCH 2/6] Support to parse PrintGCID https://github.com/chewiebug/GCViewer/issues/197 --- .../perf/gcviewer/imp/AbstractDataReaderSun.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java index 8de97d72..c43a4ef3 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java @@ -306,21 +306,23 @@ protected void parseId(String line, ParseInformation pos) throws ParseException return; int i = pos.getIndex(); try { - // consume all leading spaces and # + // consume all leading spaces and '#' final int lineLength = line.length(); final char[] lineChars = line.toCharArray(); char c = lineChars[i]; for (; i < lineLength; c = lineChars[++i]) { - if (c != ' ' && c != '#') break; + if (c != ' ' && c != '#') + break; } if (i >= lineLength) throw new ParseException("Unexpected end of line.", line); - // check whether the type name starts with a number + // check whether the Id starts with a number // -> skip number for (; Character.isDigit(c) && i < lineLength; c = lineChars[++i]); - // -> skip : + // -> skip ':' for (; i Date: Thu, 28 Jul 2022 15:25:29 +0800 Subject: [PATCH 3/6] Support to parse PrintGCID also for G1GC --- .../com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java index 267385ab..0503b5cd 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java @@ -551,6 +551,7 @@ protected AbstractGCEvent parseLine(String line, ParseInformation pos) throws // pre-used->post-used, total, time ZonedDateTime datestamp = parseDatestamp(line, pos); double timestamp = getTimestamp(line, pos, datestamp); + parseId(line, pos); ExtendedType type = parseType(line, pos); // special provision for concurrent events if (type.getConcurrency() == Concurrency.CONCURRENT) { From 0732264c02b58a1ffbc929bcfaf9782ce7946a8c Mon Sep 17 00:00:00 2001 From: zhaixiang Date: Thu, 28 Jul 2022 17:33:27 +0800 Subject: [PATCH 4/6] Support to parse PrintGCID also for jdk8 G1GC --- .../com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java index 0503b5cd..dc5717db 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java @@ -579,7 +579,8 @@ else if (type.getCollectionType().equals(CollectionType.VM_OPERATION)) { parseDetailEventsIfExist(line, pos, event); if (event.getExtendedType().getPattern() == GcPattern.GC_MEMORY_PAUSE) { - setMemoryAndPauses(event, line, pos); + if (!line.contains("#")) + setMemoryAndPauses(event, line, pos); } else { event.setPause(parsePause(line, pos)); From e5771d5bde2b93a57602965fcc894445fe72f2a7 Mon Sep 17 00:00:00 2001 From: zhaixiang Date: Thu, 28 Jul 2022 21:36:43 +0800 Subject: [PATCH 5/6] Support to parse PrintGCID also for jdk8 G1GC --- .../perf/gcviewer/imp/AbstractDataReaderSun.java | 1 + .../tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0.java | 1 + .../tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java | 9 ++++++--- .../tagtraum/perf/gcviewer/model/AbstractGCEvent.java | 1 + 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java index c43a4ef3..3399d788 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java @@ -326,6 +326,7 @@ protected void parseId(String line, ParseInformation pos) throws ParseException } } finally { + i++; pos.setIndex(i); } } diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0.java index f65073e1..34a9720f 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0.java @@ -620,6 +620,7 @@ protected AbstractGCEvent parseLine(String line, ParseInformation pos) throws // pre-used->post-used, total, time ZonedDateTime datestamp = parseDatestamp(line, pos); double timestamp = getTimestamp(line, pos, datestamp); + // Support for PrintGCID parseId(line, pos); ExtendedType type = parseType(line, pos); AbstractGCEvent ae; diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java index dc5717db..32c1dac1 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java @@ -551,6 +551,7 @@ protected AbstractGCEvent parseLine(String line, ParseInformation pos) throws // pre-used->post-used, total, time ZonedDateTime datestamp = parseDatestamp(line, pos); double timestamp = getTimestamp(line, pos, datestamp); + // Support for PrintGCID parseId(line, pos); ExtendedType type = parseType(line, pos); // special provision for concurrent events @@ -579,10 +580,12 @@ else if (type.getCollectionType().equals(CollectionType.VM_OPERATION)) { parseDetailEventsIfExist(line, pos, event); if (event.getExtendedType().getPattern() == GcPattern.GC_MEMORY_PAUSE) { - if (!line.contains("#")) + // Support for PrintGCID + if (line.contains("#")) + event.setPause(parsePause(line, pos)); + else setMemoryAndPauses(event, line, pos); - } - else { + } else { event.setPause(parsePause(line, pos)); } } diff --git a/src/main/java/com/tagtraum/perf/gcviewer/model/AbstractGCEvent.java b/src/main/java/com/tagtraum/perf/gcviewer/model/AbstractGCEvent.java index 7584412b..09b9204d 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/model/AbstractGCEvent.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/model/AbstractGCEvent.java @@ -662,6 +662,7 @@ public String toString() { public static final Type UJL_CMS_CONCURRENT_OLD = new Type("Old", Generation.TENURED, Concurrency.CONCURRENT, GcPattern.GC_MEMORY); // unified jvm logging g1 event types + public static final Type UJL_G1_PAUSE_YOUNG = new Type("pause (G1 Evacuation Pause) (young)", Generation.YOUNG, Concurrency.SERIAL, GcPattern.GC_PAUSE); public static final Type UJL_G1_PAUSE_MIXED = new Type("Pause Mixed", Generation.TENURED, Concurrency.SERIAL, GcPattern.GC_MEMORY_PAUSE); public static final Type UJL_G1_TO_SPACE_EXHAUSTED = new Type("To-space exhausted", Generation.YOUNG, Concurrency.SERIAL, GcPattern.GC); public static final Type UJL_G1_CONCURRENT_CYCLE = new Type("Concurrent Cycle", Generation.TENURED, Concurrency.CONCURRENT, GcPattern.GC_PAUSE); From 3a93fcc2a01ef970d641b7a51c37f217d770f37f Mon Sep 17 00:00:00 2001 From: zhaixiang Date: Tue, 2 Aug 2022 10:17:36 +0800 Subject: [PATCH 6/6] Support to parse PrintGCID only test PSGC --- .../gcviewer/imp/AbstractDataReaderSun.java | 3 ++- .../perf/gcviewer/imp/DataReaderSun1_6_0.java | 3 +-- .../perf/gcviewer/imp/DataReaderSun1_6_0G1.java | 9 ++------- .../perf/gcviewer/model/AbstractGCEvent.java | 1 - .../gcviewer/imp/TestDataReaderSun1_8_0.java | 15 +++++++++++++++ .../openjdk/SampleSun1_8_0ParallelPrintGCID.txt | 17 +++++++++++++++++ 6 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 src/test/resources/openjdk/SampleSun1_8_0ParallelPrintGCID.txt diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java index 3399d788..50c7f0bc 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java @@ -301,7 +301,8 @@ protected String parseTypeString(String line, ParseInformation pos) throws Parse } } - protected void parseId(String line, ParseInformation pos) throws ParseException { + // restriction PringGCID only for parallel scavenge collector + protected void parseGcId(String line, ParseInformation pos) throws ParseException { if (!line.contains("#")) return; int i = pos.getIndex(); diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0.java index 34a9720f..784445cc 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0.java @@ -620,8 +620,7 @@ protected AbstractGCEvent parseLine(String line, ParseInformation pos) throws // pre-used->post-used, total, time ZonedDateTime datestamp = parseDatestamp(line, pos); double timestamp = getTimestamp(line, pos, datestamp); - // Support for PrintGCID - parseId(line, pos); + parseGcId(line, pos); ExtendedType type = parseType(line, pos); AbstractGCEvent ae; if (type.getConcurrency() == Concurrency.CONCURRENT) { diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java index 32c1dac1..ae45d0b0 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0G1.java @@ -551,8 +551,7 @@ protected AbstractGCEvent parseLine(String line, ParseInformation pos) throws // pre-used->post-used, total, time ZonedDateTime datestamp = parseDatestamp(line, pos); double timestamp = getTimestamp(line, pos, datestamp); - // Support for PrintGCID - parseId(line, pos); + parseGcId(line, pos); ExtendedType type = parseType(line, pos); // special provision for concurrent events if (type.getConcurrency() == Concurrency.CONCURRENT) { @@ -580,11 +579,7 @@ else if (type.getCollectionType().equals(CollectionType.VM_OPERATION)) { parseDetailEventsIfExist(line, pos, event); if (event.getExtendedType().getPattern() == GcPattern.GC_MEMORY_PAUSE) { - // Support for PrintGCID - if (line.contains("#")) - event.setPause(parsePause(line, pos)); - else - setMemoryAndPauses(event, line, pos); + setMemoryAndPauses(event, line, pos); } else { event.setPause(parsePause(line, pos)); } diff --git a/src/main/java/com/tagtraum/perf/gcviewer/model/AbstractGCEvent.java b/src/main/java/com/tagtraum/perf/gcviewer/model/AbstractGCEvent.java index 09b9204d..7584412b 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/model/AbstractGCEvent.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/model/AbstractGCEvent.java @@ -662,7 +662,6 @@ public String toString() { public static final Type UJL_CMS_CONCURRENT_OLD = new Type("Old", Generation.TENURED, Concurrency.CONCURRENT, GcPattern.GC_MEMORY); // unified jvm logging g1 event types - public static final Type UJL_G1_PAUSE_YOUNG = new Type("pause (G1 Evacuation Pause) (young)", Generation.YOUNG, Concurrency.SERIAL, GcPattern.GC_PAUSE); public static final Type UJL_G1_PAUSE_MIXED = new Type("Pause Mixed", Generation.TENURED, Concurrency.SERIAL, GcPattern.GC_MEMORY_PAUSE); public static final Type UJL_G1_TO_SPACE_EXHAUSTED = new Type("To-space exhausted", Generation.YOUNG, Concurrency.SERIAL, GcPattern.GC); public static final Type UJL_G1_CONCURRENT_CYCLE = new Type("Concurrent Cycle", Generation.TENURED, Concurrency.CONCURRENT, GcPattern.GC_PAUSE); diff --git a/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderSun1_8_0.java b/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderSun1_8_0.java index f86f0ccc..929b1d09 100644 --- a/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderSun1_8_0.java +++ b/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderSun1_8_0.java @@ -417,4 +417,19 @@ public void shenandoah_232_Beginning() throws Exception { is(1L)); } + @Test + public void parallelPrintGCID() throws Exception { + TestLogHandler handler = new TestLogHandler(); + handler.setLevel(Level.WARNING); + GCResource gcResource = new GcResourceFile("SampleSun1_8_0ParallelPrintGCID.txt"); + gcResource.getLogger().addHandler(handler); + + DataReader reader = getDataReader(gcResource); + GCModel model = reader.read(); + + assertThat("gc count", model.size(), is(5)); + + assertEquals("number of errors", 0, handler.getCount()); + } + } diff --git a/src/test/resources/openjdk/SampleSun1_8_0ParallelPrintGCID.txt b/src/test/resources/openjdk/SampleSun1_8_0ParallelPrintGCID.txt new file mode 100644 index 00000000..a4fbc765 --- /dev/null +++ b/src/test/resources/openjdk/SampleSun1_8_0ParallelPrintGCID.txt @@ -0,0 +1,17 @@ +OpenJDK 64-Bit Server VM (25.71-b00) for linux-loongarch64 JRE (1.8.0-internal-loongson_2022_07_26_20_28-b00), built on Jul 26 2022 20:34:57 by "loongson" with gcc 8.3.0 +Memory: 16k page, physical 16539232k(15517424k free), swap 9227440k(9227440k free) +CommandLine flags: -XX:InitialHeapSize=10737418240 -XX:MaxHeapSize=10737418240 -XX:MaxNewSize=9663676416 -XX:NewSize=9663676416 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCID -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC +2022-07-26T21:00:40.750+0800: 3.117: #0: [GC (Allocation Failure) [PSYoungGen: 7077888K->222570K(8257536K)] 7077888K->222586K(9306112K), 0.5437135 secs] [Times: user=1.92 sys=0.20, real=0.55 secs] +2022-07-26T21:00:45.037+0800: 7.405: #1: [GC (System.gc()) [PSYoungGen: 3729513K->98289K(8257536K)] 3729529K->98321K(9306112K), 0.1937274 secs] [Times: user=0.69 sys=0.07, real=0.19 secs] +2022-07-26T21:00:45.231+0800: 7.599: #2: [Full GC (System.gc()) [PSYoungGen: 98289K->0K(8257536K)] [ParOldGen: 32K->98112K(1048576K)] 98321K->98112K(9306112K), [Metaspace: 16471K->16471K(1064960K)], 0.6492397 secs] [Times: user=1.52 sys=0.17, real=0.65 secs] +2022-07-26T21:02:14.912+0800: 97.280: #3: [GC (System.gc()) [PSYoungGen: 6687404K->105989K(8257536K)] 6785517K->204182K(9306112K), 0.0216159 secs] [Times: user=0.06 sys=0.00, real=0.03 secs] +2022-07-26T21:02:14.934+0800: 97.301: #4: [Full GC (System.gc()) [PSYoungGen: 105989K->0K(8257536K)] [ParOldGen: 98192K->203813K(1048576K)] 204182K->203813K(9306112K), [Metaspace: 19966K->19962K(1067008K)], 0.4555626 secs] [Times: user=1.52 sys=0.13, real=0.45 secs] +Heap + PSYoungGen total 8086016K, used 7277906K [0x0000000580000000, 0x00000007c0000000, 0x00000007c0000000) + eden space 7013376K, 88% used [0x0000000580000000,0x00000006fabd8888,0x000000072c100000) + from space 1072640K, 99% used [0x000000077e880000,0x00000007bfffc138,0x00000007c0000000) + to space 1211904K, 0% used [0x000000072c100000,0x000000072c100000,0x0000000776080000) + ParOldGen total 1048576K, used 370122K [0x0000000540000000, 0x0000000580000000, 0x0000000580000000) + object space 1048576K, 35% used [0x0000000540000000,0x00000005569728e0,0x0000000580000000) + Metaspace used 29044K, capacity 29852K, committed 29952K, reserved 1075200K + class space used 3288K, capacity 3510K, committed 3584K, reserved 1048576K