From 61201c45c24824310b7d5380ef605f9e568cbf98 Mon Sep 17 00:00:00 2001 From: Leslie Zhai Date: Mon, 29 Aug 2022 21:57:24 +0800 Subject: [PATCH 01/18] Support to parse PrintGCID (#260) --- .../gcviewer/imp/AbstractDataReaderSun.java | 31 +++++++++++++++++++ .../perf/gcviewer/imp/DataReaderSun1_6_0.java | 1 + .../gcviewer/imp/DataReaderSun1_6_0G1.java | 4 +-- .../gcviewer/imp/TestDataReaderSun1_8_0.java | 15 +++++++++ .../SampleSun1_8_0ParallelPrintGCID.txt | 17 ++++++++++ 5 files changed, 66 insertions(+), 2 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 8d0004af..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,6 +301,37 @@ protected String parseTypeString(String line, ParseInformation pos) throws Parse } } + // restriction PringGCID only for parallel scavenge collector + protected void parseGcId(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 Id 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); + 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 267385ab..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,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); + parseGcId(line, pos); ExtendedType type = parseType(line, pos); // special provision for concurrent events if (type.getConcurrency() == Concurrency.CONCURRENT) { @@ -579,8 +580,7 @@ else if (type.getCollectionType().equals(CollectionType.VM_OPERATION)) { if (event.getExtendedType().getPattern() == GcPattern.GC_MEMORY_PAUSE) { setMemoryAndPauses(event, line, pos); - } - else { + } else { event.setPause(parsePause(line, pos)); } } 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 From cdf5eb85fb5ff19a9540e764fdf005ccaede999b Mon Sep 17 00:00:00 2001 From: chewiebug Date: Mon, 29 Aug 2022 19:09:26 +0200 Subject: [PATCH 02/18] (hopefully) fix deployment to sourceforge --- .travis.yml | 4 ++-- README.md | 1 + cicd/Dockerfile | 5 ----- cicd/docker-build.bat | 1 + pom.xml | 2 +- 5 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 cicd/Dockerfile create mode 100644 cicd/docker-build.bat diff --git a/.travis.yml b/.travis.yml index 3e4d1eb6..3d33cc6d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,8 +36,8 @@ env: - GPG_DIR="`pwd`/cicd/gpg" - secure: arRS4YHFdZWyl7KmduSdzOF1JGm1qOWDLp1fwtzCkGUx58G3RrhhBIynK3TuSnnUTYsmS+DyxR/R+v3QhaEjschR4Aeolq9StJGvUBssTS+oCqcLe3qLiHyy9YClCb8xSPebYNgrxEox0MuEGG73TFRUrGLHxesBo9OfLgIiGpV+kez2cBD+iFWEfNA9oeO3x3fa7Ry/YBrRfUkA5gKR41Bw/oOf+5T0HAKMpfMMmCneu7EtA3z7cWHhEEBwydwUI+szS3ozsbyUcleLwTlwabLXEB3rF3c/rU2Zy/1CLfWzJwCmy47HfclTalj/ckNxh5pK9aQwVqFM3B8ECPBUOksYm28oREgcRFbLqrtRnrKMM5tvqHXsb3r7VyJkNzFenV8e3WES8kCL7z5yuCstac395AlLRBCWTEWbHiiKTIYfx4awY5lK2CxptCf+8mzzkfltQp6HOViLw+X9c/G4MNTUWlDeMnw3JB81Rm5qaKv4gNjq9G0cPS9rzRN6SwksIEZ2i2JmVzCOoU7tWgH6ahcBDU3jJI3bwODzkzND5j0y9jKtooYEKPAH2v5b/uB/6KIlCLa/jZQcCzuTrOlKT6/Zcxl4aDUonuJ8vUDl3gMj72iqZpNosqOWIL0YVy8wlmxCaai3MK2H1647Mw5DXWzIciSN/TLwCjF3344fxHc= - secure: L2mbuVWefCqtdy9qNcVtxW5nI2/kLY6vTXasQ19mevfxCHcyN23d8zDvCU0lRT9k9k9znXrF3JppzLwW2wkZo72XADQj+hfCSCB8axu1NQPPi3IMkFe4/c/mEXRVHYvukEjTX10BmZUfjL2H2XRiLM2eOunbRxyE6DfmIz6HuW5LS3iNi9BZQce6iHm/jG0Li+SxCgqetwZ3/Gowl1vo5vfg+xVnqTalYuSfvlJAAKfZdkw47/5T0np7ooD4W0TfFohFpq2DlVK1m27qSc0tDe9CT7YkAXid7giVfe+RC5rEoJhKf87wuKC/hitUS+OJb6hJg3IVGhsiA44w57eK6g7Gm+nDrJzId8XOYugy7VaIaVMJjoqWG8AnhbFzh2/ioWq4jI7xmjzBnKSak+DpxPvEs26WEE12m3nJVQvFpvoTTusnJuS2zUYk6ZSupdv8rw3fsIKHYepNyiCHau0WGgs1kqApA6bY3V42FFakC57x5dL5RNi54MBOzS9JBoQ6BsUewtarIdxsKUawA9TKC2M1IRI2poS0Zex9BslV08KBfzSvSI1h06kRaR6S35CwqlWnVcC+ZK4l3vOtpPYOGAo8F8OLONcUYuGMMQH+Eycvnd7yyLSbDEaEkNEBYL1uBSw6ZbRQzlFIS8v2t6BDed37WWLDD+TGnODcVJ7lhG8= - - secure: UunPp8yEYLSgQez5CUk9qdi1QQGidDQlojrScsKtz/ixhm+dv1aqu+SeqVEVFjRvCeqghB+TGufw1mxkjNwsOL+hZDmsnfex+ZR6c1swk19BarlhKVc6+lAJ/2KsOaXjdAnS5w0Xyhqp+BMJxjYfhLaaSZj1+AUiXsG4dhRzl8jylx5caJu3jG3DN0wYVM54wHpx3Vz0Rx8oDLpr6Clh8dctvxJz88cT3OH2zDiMOfSMbrfOE4ENbRDCrX/ktQl2w6L8VBu29srIUqv862Pia9F6mjsZNuWJZu/yidnX/q+ctQawT0BQJJ1U9BhWKEKhOeS5AwSiBISxtvXU4gChSqOSrSe87Zt00ndlL+LkanSbehvGEaoRmi1AKxTh/jPvkiiiYj/yH3Rh+gLvkIxDQk0tvMvT42X1GblRS4aPAxGwYb/1Sx/3VThOpGSNRyH5xC8Ccr7AmOjcZUTUm0ZV45XX2QUiAlTJvrsbW1yvWyCdsYh36fxWgLdaokhbb4APkwDQTnQZ3zMyNSMqb4v/3gTWmZmMDtXrQ6/YHdufhuDJeCt3ibFdd5BX6GFS3zQ+GKPE4lHtexR8BnFA1hLfH0jIDnAduA5mgX4w6G/dSw7Bf7HGROwB2jBSRAVgruF3kTT3M9S+0rOgceuZTTeUvfl/KLAFeS5j2mO5qmdOPQE= - - secure: hfbgSnGViHzpZBIUehTm0na8CPBGXTASeOwgxzH2fiJuTQtp/hGO3bNo5zhPW+wMWj5or5EgmcTbRVQUu6zfOmaECi1Vf1Ul42qimlR8NLCBLSoPIcBgO2re/jQFZNUe6NTAoZsVAtMaBplmeOydrjFFb1NqufbSqVX2H7IrjwIFjc/E7vG+pgjBaPh6SMWrhZHUK+aID9Ssssr9KZc2lzq1rqSC1U2M/SQf9EbVEAxkyuR77aZhnkjZlUo97gmVBscStso4bUEgU54gYL0NiSiOrRhH+8N/mb/AJMyn/KGgyNJMai0wMn4WW381iVf4huG95C/RcQOYG/OEGBuR7N1yQEVhtV3SAJPBWXp3fQcL6CnWkn4N2Tc66sjbhAD06p5fSY2YWd5uGCzG9qvw3GABcHLx5q1rpBiwgHKHF+79subsYkhhUhXHSikh8ySeniXcS1LWVpUBe6Y2hDBGh2g3zru/Rkdvv7lHZgu6BNyb1tETCCU5TvpHJVd7YxoR7cGEWHQQcycmpVL6OYwhXG52nv/r2fPBICDfyzhPDyY6uei0p3/p0t3Qgby65phmaTPbqDM5FPy43iRp4zCJ5hKgmHlhXeGS7y2AavTSMk6Da4jz7bLZkIXM90MWcIh4saXU61cJKkPz2cuzovU07WaFwCo9rapbzfbuSSfrYvQ= + - secure: "Q1uubVVyKl9WActtY2nquhEdxsnaBdG79+QKTkLwNap3/Eioii8bLpGQTVsI4860lIbUmankD+5mfw3jl0lpeTtLPYXlewKN6eYXE/IpaWfJon4x3DxeSSSjvLYGh5CPbsnnFyygFb+TrIirTX1LJfT8nmlqUiSFsGmc7TcB+dU8+hBCbQl4wOJ9Rw0Ctzz8JSinl+nHiQyfqztc/RHmQOwATbbWK0QtAWst3hyupPPkFBWL1AXvoWJAWcLhxe5ZLtkZb3ZrPdxl6U6dZJQaAKDf+i4OlacWoS6Nzg4mDIKCiOBM6ad2/EjBmPDW9XXi7hbvhDp/T3Nn9xAolMewxni/vWM8is28a0cO7KfsHMab+UMV545lRxvyVEUn2ZFmZ+banKyrmXS0ezBYoDk2+BsLF00p63IZ++7v2PsCo9VMjIaUnYUntt5sxL9gs+TRQyx8HnN50aIP4WpGALJ9hfJxdBkpnfyTBcck2hOJfJduPPCbI03eccE+QUJ8antoyaAbn5LkciQef8y6PNbcVwTxdVF9JeUkhjyIqsez37gi0XeoDPvZN62G+q6XUv3TUGcC4y92v7cY51amNoYhgbxdx2o3Vezl9TbZurqoWQ1cbIdQiSjzIoBCvbjk9gPOotLWMVMxej+3DKjHB8CwkV/nRpzCCDegV0q1TFPthk0=" + - secure: "I4rNPKkzz3faTxlRxlCpQhMsogHRVnfxaSAvR9eNq7QGx+YKsqcTZ0LEmzjWiuiZ3iylFA12BkuULRNahaNQC5kNKdGK8Aqm8LQO1us4QdVOGPFpz+ieK21Zgz1mesWKp0ES4rwVkTIsGM+netS7q2DLQpka1gqRP7zmoa3WkeXlXLiHbXlA9rtZYbUhLqpMm2+GjeMGEiPI/EFuSfjDztbaEtbixJC+5OTL7YbJztD3TqvI4d3QtX3RbSdLv5Xn8pGFLHHix9lL4uVEvrK6AZQtl/0k6gqXjuyxSs2qMtChLk95Z0mw5KliYL3XUu2+SZOe7C+VSr3eXBzHqY0FmEZ6NINVWmeUuN715eCSiGUbsZe+NbdONouPsi4N6Vc+9cg+QE8ve5PXZbZattbI1SOB0xjZVj95n26LhuYMa3v5wjF9U6maOBtuvuy6WxNuP2h8qkWgw2ggdJZCAtPfnNzUsSa4ZpxoTncSiDK22EJOHwJxbuJpmqCNrN0DPOVnPN4QKHGaZ2G9lo6KOvsny7QKdYXJDivoaHEeRhKlCenElexpP8eF2bnn2zoOplL27xOsHPfUSWPPdDg+IfTfocSqkwXpXtUyFLUQY2jUkVwq650n/s8pVDpVB0VqkwDKeeLh+C/zSNTBBBEuWJe+bsmJ8VJ5Ag6QjICB54DTC4g=" - secure: "o8U8fTK6YwArlxxlpAPhPh2GV+Dl63R9K/Oq3jN4mjrrS+jvf905EqeQSEquC1uZ/ZwbD34kaFj/a50qX23axZFf09Sy9kPFNHgSNPXURZtshCNn2IimsU3eCKb6lM1MyKRa5Ue81sZVT+3Q673q9ndorHbjINb/iCg7wzx+DBNeuG5R8DXFM8ddxf19fKKkQSbzwa64lgZ8gH19TWShg2pYgLCxJxfYrt2acIJEshYyCbJxGrMVdkPztCaXqePV17saNUkbuYcVdAe3KkK/GsPe52FucbiVed705CDIJ3ODpWrx4Nsj9uFg9wuiCWWjBYIwpT+svV1lmvT9X5ViSMnazV+sNY1vpq5zDItU/lg9RsiVGVns4EEYAoJ4J4ky7KB6CC/9Nx7+oWoCNDfC80i61eEXNqg+TuKeBYKmOs/l5GnAyE7voxXUoyqBak7yu97Wp9iTRg6AoXSWiMeWnYBS5yRS/8gAaPUvfvp42ahZkiRli3R18E3s9LG1x/LowZhhGDDHum3QklJzPJlMm8BWSBJkhOgLApNWELZAtwS5yiEw4QIEQyZNEaoH9ENnpAfJIsPv1dX4nBHUlD8AhERGyUWHY95bL8GPzboBhM08pQdH+caYDRx3Fj3jICkuwYHz7RpDPAdpLMHCYoMQCjxhUy0br9GRRW0/he1Tdbw=" - secure: "bUq1LIA4FurrzaYPYg3RRKg5aaENIQTOFVCQEH+J81N4h+3O86l8pDM8RVv84M1TvsTpitUD1Agdg6qOK4IG61AVFGh6XHOMc3i/o2X0z03LCjW+J2k0ETPA1DwundgfdBitzEGedO6XQvlhVlVDg7QVEHeA3FxWPWy4+fvGEqDNEHCYPr4Q2Q/59hEXDtMIMvsHA8VOCMTuA+NRY8SkyyewXWSarNrlM+wyhIO8RcZxOEsHPKI+tIWyYInMd5mv2RZX6cs+Ia37c4ajpNXPViAe7oQHI99aFUWsUEfSydqMfVY/iDWig4bs5i/k7mln13RALyqsBFkNB+dSi36FJV2CgqnY9+YjNo4FRarXDlLwaGGPsVCgjN1xxeD+MOSqJaCM2aNiNPgB5KsGDLDTLQbcGJr4frjtGG0x1mTBD+n3GyxYcum6dWlUNGJ7IN1rShQFC+e//oHAEDNmNGkKzVVbBLJZTyirm5GJYpUq4vWDmFJsEb2CK1C2W4qVX/NSmixD2/S0x2+osWgPitkIlyKQwOjSFag6hEpqQNwuNv7HCO2JtCjfg25Ur4itZkon5oICRgznhfWuDGf9UbBc+SI3vPGlhkjH3oUqa4RCn/W5BVeug/xrfRB6AJ9k1mg8g1xCvECG2ZA9epA40PDdDqcsS6WyYcEPPvnk2wpqZY0=" - secure: "lUTaoCHgQk0xYpEtRFPJXn1Eduf5WVCyAa6/cWECGcYfrhW3kYXDHKtHwhUwi/HPGyLg0ZFi1DBaiv7QareW/D1GwlPV+UTgmc1TY02XwLz7kFPb4A9896nCVOwR5xMuTL7TFzuB8/5bFGf6GGvrGnlGKWZCIOw3d8OLaiUib+BzezMsMJjouJwUiPpg9LzdhRORK4aj+uwCD+27o3i1u2yXiv4ljY/j4rMFdNAYWup5m2QPESGXJR4aTuf2uFYUEAURkUcOhtH9Uq6XQqUbW1IJqD9UVbtLGo6qCN813UXlt17DoqkPWjvsRiC7JBLFqZpT9+wrGcfSuF4HZJJOZrWxfnD/uzL4M485eUwePKCaA1M5EfYu+wpmcz5z00O59PJISAEMrmIvJTj0T87tOdKzI/TzO1ifAUMjs2z0fJOTD4O83PvQ56oppc9fsNo2jkO74DDauoSFXNo9IRHqj/ZBoklGxSA8MWjqu5mFxwEqFVca5IfUXgqI0fiBDqU81lHqsxEKiMO0C4LYD6w3yVtm3clCyMAvYIpU1owPUnA5F3V7JkhlUh8RPOViZ3xIgCZTU4lfA+jTjvC0L4nP2/xKIQMlJlUokDjqn7S2rD6Ujb0kxcxhj9d5s1dlLrJJfaqJKeE+S0yfiG8CHEEwmOlq5yEzHdt5XuKcgR5lMgY=" diff --git a/README.md b/README.md index ff6ace87..5a0ae65a 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ GCViewer 1.36 [![Build Status](https://app.travis-ci.com/chewiebug/GCViewer.svg?branch=develop)](https://app.travis-ci.com/chewiebug/GCViewer) [![codecov.io](https://codecov.io/github/chewiebug/GCViewer/coverage.svg?branch=develop)](https://codecov.io/github/chewiebug/GCViewer?branch=develop) +[![Download gcviewer](https://img.shields.io/sourceforge/dm/gcviewer.svg)](https://sourceforge.net/projects/gcviewer/files/latest/download) GCViewer is a little tool that visualizes verbose GC output generated by Sun / Oracle, IBM, HP and BEA Java Virtual Machines. It diff --git a/cicd/Dockerfile b/cicd/Dockerfile deleted file mode 100644 index 84e5d933..00000000 --- a/cicd/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM ruby:latest - -RUN gem install travis - -CMD /bin/bash \ No newline at end of file diff --git a/cicd/docker-build.bat b/cicd/docker-build.bat new file mode 100644 index 00000000..91ef354b --- /dev/null +++ b/cicd/docker-build.bat @@ -0,0 +1 @@ +docker build --tag ruby/travis travis-docker-image \ No newline at end of file diff --git a/pom.xml b/pom.xml index 60c13dae..425c590d 100644 --- a/pom.xml +++ b/pom.xml @@ -209,7 +209,7 @@ 3.0.1 1.6 3.1.0 - 1.8 + 3.1.0 3.8.0 1.4 3.1.0 From fdb24908802b0911495b68758dbf3624fe8b206a Mon Sep 17 00:00:00 2001 From: chewiebug Date: Sat, 20 Aug 2022 18:55:43 +0200 Subject: [PATCH 03/18] add Leslie Zhai to list of contributers --- pom.xml | 4 ++++ .../java/com/tagtraum/perf/gcviewer/view/AboutDialog.java | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 425c590d..568c1727 100644 --- a/pom.xml +++ b/pom.xml @@ -183,6 +183,10 @@ Yin Xunjun + + Leslie Zhai + https://github.com/xiangzhai + Eugene Zimichev https://github.com/undefz diff --git a/src/main/java/com/tagtraum/perf/gcviewer/view/AboutDialog.java b/src/main/java/com/tagtraum/perf/gcviewer/view/AboutDialog.java index 035d5e10..9899ab68 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/view/AboutDialog.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/view/AboutDialog.java @@ -80,6 +80,7 @@ public class AboutDialog extends ScreenCenteredDialog implements ActionListener "Kamil Szymanski", "Pierre Viret", "Yin Xunjun", + "Leslie Zhai", "Eugene Zimichev"}; public AboutDialog(Frame f) { @@ -94,7 +95,7 @@ public AboutDialog(Frame f) { versionPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); versionPanel.setLayout(new GridBagLayout()); - JLabel copyright = new JLabel("\u00A9" + " 2011-2021: Joerg Wuethrich and contributors", JLabel.CENTER); + JLabel copyright = new JLabel("\u00A9" + " 2011-2022: Joerg Wuethrich and contributors", JLabel.CENTER); JLabel contributorsLabel = new JLabel("contributors (alphabetically ordered):", JLabel.CENTER); contributorsLabel.setForeground(Color.GRAY); From d74690e06dda2abaab74ca8426a932ba8e87166e Mon Sep 17 00:00:00 2001 From: chewiebug Date: Mon, 29 Aug 2022 15:50:43 +0200 Subject: [PATCH 04/18] enhance jdk8 parser for serial, cms and g1 printGCID events --- .../perf/gcviewer/imp/AbstractDataReader.java | 2 +- .../gcviewer/imp/AbstractDataReaderSun.java | 11 +- .../perf/gcviewer/imp/DataReaderSun1_6_0.java | 1 + .../gcviewer/imp/DataReaderSun1_6_0G1.java | 3 +- .../gcviewer/imp/TestDataReaderSun1_8_0.java | 44 ++++++ .../imp/TestDataReaderSun1_8_0G1.java | 24 +++ .../openjdk/SampleSun1_8_0CmsPrintGcId.txt | 21 +++ .../openjdk/SampleSun1_8_0G1PrintGCID.txt | 146 ++++++++++++++++++ 8 files changed, 244 insertions(+), 8 deletions(-) create mode 100644 src/test/resources/openjdk/SampleSun1_8_0CmsPrintGcId.txt create mode 100644 src/test/resources/openjdk/SampleSun1_8_0G1PrintGCID.txt diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReader.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReader.java index 44c6e450..30c6d4d2 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReader.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReader.java @@ -62,7 +62,7 @@ protected DataReaderTools getDataReaderTools() { */ protected boolean shouldContinue() { if (getLogger().isLoggable(Level.FINE)) { - getLogger().fine(gcResource.getResourceName() + " read cancelled"); + getLogger().fine(gcResource.getResourceName() + " read cancelled=" + gcResource.isReadCancelled()); } return !gcResource.isReadCancelled(); } 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 50c7f0bc..ffedc2c7 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java @@ -256,7 +256,7 @@ protected String parseTypeString(String line, ParseInformation pos) throws Parse int i = pos.getIndex(); try { // consume all leading spaces and [ - final int lineLength = line.length(); + final int lineLength = line.length() - 1; final char[] lineChars = line.toCharArray(); char c = lineChars[i]; for (; i 0) { private int skipUntilNextDigit(String line, ParseInformation pos) throws ParseException { int begin = pos.getIndex(); - while (!Character.isDigit(line.charAt(begin)) && begin < line.length()) { + while (!Character.isDigit(line.charAt(begin)) && begin+1 < line.length()) { ++begin; } 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 784445cc..9c72573b 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 @@ -58,6 +58,7 @@ *
  • -XX:+PrintReferenceGC (output ignored)
  • *
  • -XX:+PrintCMSInitiationStatistics (output ignored)
  • *
  • -XX:+PrintFLSStatistics (output ignored)
  • + *
  • -XX:+PrintGCID (output ignored)
  • * * * @author Hendrik Schreiber 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 ae45d0b0..898cea02 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 @@ -48,6 +48,7 @@ *
  • -XX:+PrintAdaptiveSizePolicy (output ignored)
  • *
  • -XX:+PrintReferenceGC (output ignored)
  • *
  • -XX:+PrintStringDeduplicationStatistics (output ignored)
  • + *
  • -XX:+PrintGCID (output ignored)
  • * * * @author Joerg Wuethrich @@ -131,7 +132,7 @@ public class DataReaderSun1_6_0G1 extends AbstractDataReaderSun { // the following pattern is specific for G1 with -XX:+PrintGCDetails // "[: ]0.295: [GC pause (young), 0.00594747 secs]" - private static final Pattern PATTERN_GC_PAUSE = Pattern.compile("^([0-9-T:.+]{29})?[ ]?([0-9.,]+)?[: \\[]{2,3}([A-Z0-9a-z- ().]+)[, ]+([0-9.,]+)[ sec\\]]+$"); + private static final Pattern PATTERN_GC_PAUSE = Pattern.compile("^([0-9-T:.+]{29})?[ ]?([0-9.,]+)?(?:[ #0-9:]+)?[: \\[]{2,3}([A-Z0-9a-z- ().]+)[, ]+([0-9.,]+)[ sec\\]]+$"); private static final int GC_PAUSE_GROUP_DATESTAMP = 1; private static final int GC_PAUSE_GROUP_TIMESTAMP = 2; private static final int GC_PAUSE_GROUP_TYPE = 3; 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 929b1d09..69dd4299 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,6 +417,30 @@ public void shenandoah_232_Beginning() throws Exception { is(1L)); } + @Test + public void serialPrintGCID() throws Exception { + TestLogHandler handler = new TestLogHandler(); + handler.setLevel(Level.WARNING); + GCResource gcResource = new GcResourceFile("byteArray"); + gcResource.getLogger().addHandler(handler); + + ByteArrayInputStream in = new ByteArrayInputStream( + ("2022-08-01T17:14:32.660+0000: 0.177: #1: [GC (Allocation Failure) 2022-08-01T17:14:32.661+0000: 0.178: #1: [DefNew: 9766K->1056K(9792K), 0.0057621 secs] 16728K->16694K(31680K), 0.0073601 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] \n" + + "2022-08-01T17:14:32.671+0000: 0.188: #2: [GC (Allocation Failure) 2022-08-01T17:14:32.672+0000: 0.189: #2: [DefNew: 9746K->1056K(9792K), 0.0073505 secs]2022-08-01T17:14:32.680+0000: 0.197: #3: [Tenured: 24314K->24378K(24384K), 0.0036336 secs] 25384K->25370K(34176K), [Metaspace: 2712K->2712K(1056768K)], 0.0134215 secs] [Times: user=0.01 sys=0.00, real=0.02 secs] \n") + .getBytes()); + + DataReader reader = new DataReaderSun1_6_0(gcResource, in, GcLogType.SUN1_8); + GCModel model = reader.read(); + + assertThat("gc count", model.size(), is(2)); + assertThat("warnings", handler.getCount(), is(0)); + + AbstractGCEvent secondEvent = model.get(1); + assertThat("name", secondEvent.getTypeAsString(), equalTo("GC (Allocation Failure); DefNew; Tenured; Metaspace")); + assertThat("duration", secondEvent.getPause(), closeTo(0.0134215, 0.0000001)); + assertThat("before", secondEvent.getPreUsed(), is(25384)); + } + @Test public void parallelPrintGCID() throws Exception { TestLogHandler handler = new TestLogHandler(); @@ -432,4 +456,24 @@ public void parallelPrintGCID() throws Exception { assertEquals("number of errors", 0, handler.getCount()); } + @Test + public void cmsPrintGCID() throws Exception { + TestLogHandler handler = new TestLogHandler(); + handler.setLevel(Level.WARNING); + GCResource gcResource = new GcResourceFile("SampleSun1_8_0CmsPrintGcId.txt"); + gcResource.getLogger().addHandler(handler); + + DataReader reader = getDataReader(gcResource); + GCModel model = reader.read(); + + assertThat("gc count", model.size(), is(18)); + assertThat("warnings", handler.getCount(), is(0)); + + AbstractGCEvent parnew = model.get(0); + assertThat("name", parnew.getTypeAsString(), equalTo("GC (Allocation Failure); ParNew")); + assertThat("duration", parnew.getPause(), closeTo(0.0106548, 0.0000001)); + assertThat("before", parnew.getPreUsed(), is(8678)); + + } + } diff --git a/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderSun1_8_0G1.java b/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderSun1_8_0G1.java index 33e34216..2d3a6825 100644 --- a/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderSun1_8_0G1.java +++ b/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderSun1_8_0G1.java @@ -2,6 +2,7 @@ import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; @@ -14,6 +15,7 @@ import com.tagtraum.perf.gcviewer.UnittestHelper; import com.tagtraum.perf.gcviewer.UnittestHelper.FOLDER; +import com.tagtraum.perf.gcviewer.model.AbstractGCEvent; import com.tagtraum.perf.gcviewer.model.AbstractGCEvent.Type; import com.tagtraum.perf.gcviewer.model.GCEvent; import com.tagtraum.perf.gcviewer.model.GCModel; @@ -212,4 +214,26 @@ public void ignorePrintStringDeduplicationStatistics() throws Exception { assertThat("size", model.size(), is(1)); assertThat("type", model.get(0).getExtendedType().getType(), is(Type.G1_YOUNG)); } + + @Test + public void printGCID() throws Exception { + TestLogHandler handler = new TestLogHandler(); + handler.setLevel(Level.WARNING); + GCResource gcResource = new GcResourceFile("SampleSun1_8_0G1PrintGCID.txt"); + gcResource.getLogger().addHandler(handler); + + DataReader reader = getDataReader(gcResource); + GCModel model = reader.read(); + + assertThat("warnings", handler.getCount(), is(0)); + assertThat("gc count", model.size(), is(11)); + + AbstractGCEvent parnew = model.get(0); + assertThat("name", parnew.getTypeAsString(), equalTo("GC pause (G1 Evacuation Pause) (young)")); + assertThat("duration", parnew.getPause(), closeTo(0.0087570, 0.0000001)); + assertThat("before", parnew.getPreUsed(), is(7168)); + + } + + } diff --git a/src/test/resources/openjdk/SampleSun1_8_0CmsPrintGcId.txt b/src/test/resources/openjdk/SampleSun1_8_0CmsPrintGcId.txt new file mode 100644 index 00000000..90365a4a --- /dev/null +++ b/src/test/resources/openjdk/SampleSun1_8_0CmsPrintGcId.txt @@ -0,0 +1,21 @@ +OpenJDK 64-Bit Server VM (25.342-b07) for linux-amd64 JRE (1.8.0_342-b07), built on Jul 16 2022 09:19:19 by "openjdk" with gcc 4.4.7 20120313 (Red Hat 4.4.7-23) +Memory: 4k page, physical 2097152k(2094644k free), swap 3145728k(3145728k free) +CommandLine flags: -XX:InitialHeapSize=33554432 -XX:MaxHeapSize=536870912 -XX:MaxNewSize=174485504 -XX:MaxTenuringThreshold=6 -XX:OldPLABSize=16 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCID -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC +2022-08-01T17:16:33.170+0000: 0.169: #0: [GC (Allocation Failure) 2022-08-01T17:16:33.171+0000: 0.170: #0: [ParNew: 8678K->1081K(9792K), 0.0088699 secs] 8678K->8064K(31680K), 0.0106548 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] +2022-08-01T17:16:33.185+0000: 0.185: #1: [GC (Allocation Failure) 2022-08-01T17:16:33.186+0000: 0.185: #1: [ParNew: 9760K->1056K(9792K), 0.0089566 secs] 16743K->16701K(31680K), 0.0103324 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] +2022-08-01T17:16:33.198+0000: 0.197: #2: [GC (CMS Initial Mark) [1 CMS-initial-mark: 15645K(21888K)] 18533K(31680K), 0.0010369 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] +2022-08-01T17:16:33.200+0000: 0.199: #2: [CMS-concurrent-mark-start] +2022-08-01T17:16:33.201+0000: 0.201: #3: [GC (Allocation Failure) 2022-08-01T17:16:33.202+0000: 0.201: #3: [ParNew: 9746K->1056K(9792K), 0.0062763 secs] 25391K->25378K(34560K), 0.0073592 secs] [Times: user=0.01 sys=0.01, real=0.01 secs] +2022-08-01T17:16:33.213+0000: 0.212: #2: [CMS-concurrent-mark: 0.005/0.013 secs] [Times: user=0.01 sys=0.01, real=0.02 secs] +2022-08-01T17:16:33.214+0000: 0.213: #4: [GC (Allocation Failure) 2022-08-01T17:16:33.214+0000: 0.213: #4: [ParNew: 9751K->1056K(9792K), 0.0056495 secs] 34072K->34054K(43200K), 0.0064721 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] +2022-08-01T17:16:33.221+0000: 0.220: #2: [CMS-concurrent-preclean-start] +2022-08-01T17:16:33.222+0000: 0.221: #2: [CMS-concurrent-preclean: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] +2022-08-01T17:16:33.222+0000: 0.222: #5: [GC (Allocation Failure) 2022-08-01T17:16:33.223+0000: 0.222: #5: [ParNew: 9754K->1056K(9792K), 0.0051785 secs] 42752K->42730K(51840K), 0.0060566 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] +2022-08-01T17:16:33.230+0000: 0.229: #2: [GC (CMS Final Remark) [YG occupancy: 1868 K (9792 K)]2022-08-01T17:16:33.230+0000: 0.230: #2: [Rescan (parallel) , 0.0007821 secs]2022-08-01T17:16:33.231+0000: 0.231: #2: [weak refs processing, 0.0004025 secs]2022-08-01T17:16:33.232+0000: 0.231: #2: [class unloading, 0.0005587 secs]2022-08-01T17:16:33.233+0000: 0.232: #2: [scrub symbol table, 0.0003980 secs]2022-08-01T17:16:33.233+0000: 0.233: #2: [scrub string table, 0.0002950 secs][1 CMS-remark: 41674K(42048K)] 43542K(51840K), 0.0039463 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] +2022-08-01T17:16:33.235+0000: 0.234: #2: [CMS-concurrent-sweep-start] +2022-08-01T17:16:33.235+0000: 0.234: #2: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] +2022-08-01T17:16:33.235+0000: 0.235: #2: [CMS-concurrent-reset-start] +2022-08-01T17:16:33.236+0000: 0.236: #6: [GC (Allocation Failure) 2022-08-01T17:16:33.237+0000: 0.236: #6: [ParNew: 9744K->1056K(9792K), 0.0026933 secs] 51417K->51405K(79248K), 0.0034839 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] +2022-08-01T17:16:33.244+0000: 0.243: #7: [GC (Allocation Failure) 2022-08-01T17:16:33.244+0000: 0.243: #7: [ParNew: 9745K->1056K(9792K), 0.0028328 secs] 60094K->60082K(79248K), 0.0037992 secs] [Times: user=0.00 sys=0.01, real=0.00 secs] +2022-08-01T17:16:33.250+0000: 0.250: #8: [GC (Allocation Failure) 2022-08-01T17:16:33.251+0000: 0.250: #8: [ParNew: 9757K->1036K(9792K), 0.0016622 secs] 68783K->61918K(79248K), 0.0025883 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] +2022-08-01T17:16:33.254+0000: 0.253: #2: [CMS-concurrent-reset: 0.006/0.018 secs] [Times: user=0.01 sys=0.01, real=0.02 secs] diff --git a/src/test/resources/openjdk/SampleSun1_8_0G1PrintGCID.txt b/src/test/resources/openjdk/SampleSun1_8_0G1PrintGCID.txt new file mode 100644 index 00000000..9df43ce3 --- /dev/null +++ b/src/test/resources/openjdk/SampleSun1_8_0G1PrintGCID.txt @@ -0,0 +1,146 @@ +OpenJDK 64-Bit Server VM (25.342-b07) for linux-amd64 JRE (1.8.0_342-b07), built on Jul 16 2022 09:19:19 by "openjdk" with gcc 4.4.7 20120313 (Red Hat 4.4.7-23) +Memory: 4k page, physical 2097152k(2094504k free), swap 3145728k(3145728k free) +CommandLine flags: -XX:InitialHeapSize=33554432 -XX:MaxHeapSize=536870912 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCID -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC +2022-08-01T17:17:33.375+0000: 0.163: #0: [GC pause (G1 Evacuation Pause) (young), 0.0087570 secs] + [Parallel Time: 5.2 ms, GC Workers: 2] + [GC Worker Start (ms): Min: 164.8, Avg: 164.9, Max: 165.0, Diff: 0.2] + [Ext Root Scanning (ms): Min: 1.2, Avg: 1.3, Max: 1.4, Diff: 0.2, Sum: 2.5] + [Update RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Processed Buffers: Min: 0, Avg: 0.0, Max: 0, Diff: 0, Sum: 0] + [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Object Copy (ms): Min: 3.2, Avg: 3.2, Max: 3.3, Diff: 0.0, Sum: 6.5] + [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 2] + [GC Worker Other (ms): Min: 0.1, Avg: 0.1, Max: 0.1, Diff: 0.0, Sum: 0.1] + [GC Worker Total (ms): Min: 4.5, Avg: 4.6, Max: 4.7, Diff: 0.2, Sum: 9.3] + [GC Worker End (ms): Min: 169.5, Avg: 169.5, Max: 169.5, Diff: 0.0] + [Code Root Fixup: 0.0 ms] + [Code Root Purge: 0.0 ms] + [Clear CT: 0.9 ms] + [Other: 2.7 ms] + [Choose CSet: 0.0 ms] + [Ref Proc: 0.7 ms] + [Ref Enq: 0.0 ms] + [Redirty Cards: 0.8 ms] + [Humongous Register: 0.0 ms] + [Humongous Reclaim: 0.0 ms] + [Free CSet: 0.0 ms] + [Eden: 7168.0K(7168.0K)->0.0B(4096.0K) Survivors: 0.0B->1024.0K Heap: 7168.0K(32768.0K)->6664.5K(32768.0K)] + [Times: user=0.01 sys=0.00, real=0.01 secs] +2022-08-01T17:17:33.389+0000: 0.177: #1: [GC pause (G1 Evacuation Pause) (young), 0.0071813 secs] + [Parallel Time: 4.9 ms, GC Workers: 2] + [GC Worker Start (ms): Min: 177.5, Avg: 177.6, Max: 177.7, Diff: 0.3] + [Ext Root Scanning (ms): Min: 0.6, Avg: 0.8, Max: 0.9, Diff: 0.3, Sum: 1.5] + [Update RS (ms): Min: 0.0, Avg: 0.2, Max: 0.5, Diff: 0.5, Sum: 0.5] + [Processed Buffers: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 2] + [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Object Copy (ms): Min: 3.0, Avg: 3.2, Max: 3.4, Diff: 0.4, Sum: 6.4] + [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.1] + [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 2] + [GC Worker Other (ms): Min: 0.1, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 0.2] + [GC Worker Total (ms): Min: 4.3, Avg: 4.3, Max: 4.4, Diff: 0.2, Sum: 8.7] + [GC Worker End (ms): Min: 181.9, Avg: 182.0, Max: 182.0, Diff: 0.1] + [Code Root Fixup: 0.0 ms] + [Code Root Purge: 0.0 ms] + [Clear CT: 0.5 ms] + [Other: 1.7 ms] + [Choose CSet: 0.0 ms] + [Ref Proc: 0.8 ms] + [Ref Enq: 0.0 ms] + [Redirty Cards: 0.6 ms] + [Humongous Register: 0.0 ms] + [Humongous Reclaim: 0.0 ms] + [Free CSet: 0.0 ms] + [Eden: 4096.0K(4096.0K)->0.0B(7168.0K) Survivors: 1024.0K->1024.0K Heap: 10760.5K(32768.0K)->10752.5K(32768.0K)] + [Times: user=0.02 sys=0.00, real=0.01 secs] +2022-08-01T17:17:33.401+0000: 0.190: #2: [GC pause (G1 Evacuation Pause) (young), 0.0052858 secs] + [Parallel Time: 3.7 ms, GC Workers: 2] + [GC Worker Start (ms): Min: 189.9, Avg: 189.9, Max: 190.0, Diff: 0.2] + [Ext Root Scanning (ms): Min: 0.3, Avg: 0.4, Max: 0.5, Diff: 0.2, Sum: 0.8] + [Update RS (ms): Min: 0.1, Avg: 0.3, Max: 0.5, Diff: 0.4, Sum: 0.6] + [Processed Buffers: Min: 1, Avg: 2.0, Max: 3, Diff: 2, Sum: 4] + [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Object Copy (ms): Min: 2.3, Avg: 2.5, Max: 2.7, Diff: 0.4, Sum: 4.9] + [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 2] + [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1] + [GC Worker Total (ms): Min: 3.1, Avg: 3.2, Max: 3.3, Diff: 0.2, Sum: 6.5] + [GC Worker End (ms): Min: 193.2, Avg: 193.2, Max: 193.2, Diff: 0.0] + [Code Root Fixup: 0.0 ms] + [Code Root Purge: 0.0 ms] + [Clear CT: 0.5 ms] + [Other: 1.1 ms] + [Choose CSet: 0.0 ms] + [Ref Proc: 0.5 ms] + [Ref Enq: 0.0 ms] + [Redirty Cards: 0.4 ms] + [Humongous Register: 0.0 ms] + [Humongous Reclaim: 0.0 ms] + [Free CSet: 0.0 ms] + [Eden: 7168.0K(7168.0K)->0.0B(5120.0K) Survivors: 1024.0K->1024.0K Heap: 17920.5K(32768.0K)->17920.5K(32768.0K)] + [Times: user=0.00 sys=0.01, real=0.01 secs] +2022-08-01T17:17:33.409+0000: 0.198: #3: [GC pause (G1 Evacuation Pause) (young) (initial-mark), 0.0037303 secs] + [Parallel Time: 2.0 ms, GC Workers: 2] + [GC Worker Start (ms): Min: 197.9, Avg: 198.0, Max: 198.0, Diff: 0.1] + [Ext Root Scanning (ms): Min: 0.3, Avg: 0.4, Max: 0.4, Diff: 0.1, Sum: 0.7] + [Update RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1] + [Processed Buffers: Min: 1, Avg: 2.0, Max: 3, Diff: 2, Sum: 4] + [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Object Copy (ms): Min: 1.2, Avg: 1.2, Max: 1.2, Diff: 0.0, Sum: 2.5] + [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 2] + [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1] + [GC Worker Total (ms): Min: 1.6, Avg: 1.7, Max: 1.7, Diff: 0.1, Sum: 3.3] + [GC Worker End (ms): Min: 199.6, Avg: 199.6, Max: 199.6, Diff: 0.0] + [Code Root Fixup: 0.0 ms] + [Code Root Purge: 0.0 ms] + [Clear CT: 0.4 ms] + [Other: 1.3 ms] + [Choose CSet: 0.0 ms] + [Ref Proc: 0.3 ms] + [Ref Enq: 0.0 ms] + [Redirty Cards: 0.4 ms] + [Humongous Register: 0.0 ms] + [Humongous Reclaim: 0.0 ms] + [Free CSet: 0.0 ms] + [Eden: 5120.0K(5120.0K)->0.0B(13312.0K) Survivors: 1024.0K->1024.0K Heap: 23040.5K(32768.0K)->23040.5K(65536.0K)] + [Times: user=0.00 sys=0.00, real=0.01 secs] +2022-08-01T17:17:33.415+0000: 0.204: #4: [GC concurrent-root-region-scan-start] +2022-08-01T17:17:33.416+0000: 0.204: #4: [GC concurrent-root-region-scan-end, 0.0002186 secs] +2022-08-01T17:17:33.416+0000: 0.204: #4: [GC concurrent-mark-start] +2022-08-01T17:17:33.418+0000: 0.206: #5: [GC pause (G1 Evacuation Pause) (young), 0.0050319 secs] + [Parallel Time: 3.6 ms, GC Workers: 2] + [GC Worker Start (ms): Min: 206.4, Avg: 206.5, Max: 206.5, Diff: 0.1] + [Ext Root Scanning (ms): Min: 0.1, Avg: 0.2, Max: 0.2, Diff: 0.1, Sum: 0.4] + [Update RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.0, Sum: 0.1] + [Processed Buffers: Min: 2, Avg: 2.0, Max: 2, Diff: 0, Sum: 4] + [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Object Copy (ms): Min: 3.1, Avg: 3.1, Max: 3.1, Diff: 0.0, Sum: 6.1] + [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] + [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 2] + [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1] + [GC Worker Total (ms): Min: 3.3, Avg: 3.4, Max: 3.4, Diff: 0.1, Sum: 6.8] + [GC Worker End (ms): Min: 209.9, Avg: 209.9, Max: 209.9, Diff: 0.0] + [Code Root Fixup: 0.0 ms] + [Code Root Purge: 0.0 ms] + [Clear CT: 0.2 ms] + [Other: 1.3 ms] + [Choose CSet: 0.0 ms] + [Ref Proc: 0.2 ms] + [Ref Enq: 0.0 ms] + [Redirty Cards: 0.3 ms] + [Humongous Register: 0.0 ms] + [Humongous Reclaim: 0.0 ms] + [Free CSet: 0.0 ms] + [Eden: 13312.0K(13312.0K)->0.0B(11264.0K) Survivors: 1024.0K->2048.0K Heap: 36352.5K(65536.0K)->36320.5K(128.0M)] + [Times: user=0.01 sys=0.01, real=0.01 secs] +2022-08-01T17:17:33.425+0000: 0.214: #4: [GC concurrent-mark-end, 0.0099227 secs] +2022-08-01T17:17:33.426+0000: 0.214: #4: [GC remark 2022-08-01T17:17:33.426+0000: 0.215: #4: [Finalize Marking, 0.0006628 secs] 2022-08-01T17:17:33.427+0000: 0.216: #4: [GC ref-proc, 0.0004662 secs] 2022-08-01T17:17:33.428+0000: 0.217: #4: [Unloading, 0.0009861 secs], 0.0040559 secs] + [Times: user=0.00 sys=0.00, real=0.00 secs] +2022-08-01T17:17:33.431+0000: 0.220: #4: [GC cleanup 41408K->41408K(128M), 0.0014223 secs] + [Times: user=0.00 sys=0.00, real=0.00 secs] \ No newline at end of file From fb3b88eb733f480a6c82fed5ae4d745487ae445c Mon Sep 17 00:00:00 2001 From: cuiweilong Date: Thu, 11 Aug 2022 21:08:54 +0800 Subject: [PATCH 05/18] fix failed parsing for ZGC --- .../imp/DataReaderUnifiedJvmLogging.java | 31 +++++++++- .../perf/gcviewer/model/AbstractGCEvent.java | 5 +- .../gcviewer/imp/TestDataReaderUJLZGC.java | 62 ++++++++++++++++++- .../sample-ujl-zgc-gc-other.txt | 37 +++++++++++ 4 files changed, 130 insertions(+), 5 deletions(-) create mode 100644 src/test/resources/openjdk/unified-jvm-logging/sample-ujl-zgc-gc-other.txt diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java index 1e48f014..4b597d9e 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java @@ -60,8 +60,9 @@ public class DataReaderUnifiedJvmLogging extends AbstractDataReader { // Group 6 / tail: Pause Init Mark 1.070ms // Regex: ^(?:\[(?
    + + Cui Weiloong + https://github.com/CuiWeiloong + Yin Xunjun diff --git a/src/main/java/com/tagtraum/perf/gcviewer/view/AboutDialog.java b/src/main/java/com/tagtraum/perf/gcviewer/view/AboutDialog.java index 9899ab68..ced8bbcb 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/view/AboutDialog.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/view/AboutDialog.java @@ -79,6 +79,7 @@ public class AboutDialog extends ScreenCenteredDialog implements ActionListener "Jeffrey Swan", "Kamil Szymanski", "Pierre Viret", + "Cui Weiloong", "Yin Xunjun", "Leslie Zhai", "Eugene Zimichev"}; From 561d3791afd797d465ac54a19c85951c87bd8c75 Mon Sep 17 00:00:00 2001 From: Matt Foulks they/them Date: Wed, 1 Mar 2023 16:00:37 -0500 Subject: [PATCH 11/18] Add ability to zoom via scroll wheel (#263) Co-authored-by: Matt Foulks --- pom.xml | 4 +++ .../perf/gcviewer/view/AboutDialog.java | 1 + .../perf/gcviewer/view/GCDocument.java | 3 +-- .../perf/gcviewer/view/GCViewerGui.java | 3 ++- .../perf/gcviewer/view/ModelChartImpl.java | 25 ++++++++++++++++--- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index e8b78d95..6c5953aa 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,10 @@ Ryan Gardner + + Matt Foulks + https://github.com/mfoulks3200 + Martin Geldmacher https://github.com/geld0r diff --git a/src/main/java/com/tagtraum/perf/gcviewer/view/AboutDialog.java b/src/main/java/com/tagtraum/perf/gcviewer/view/AboutDialog.java index ced8bbcb..bf8be6e6 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/view/AboutDialog.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/view/AboutDialog.java @@ -43,6 +43,7 @@ public class AboutDialog extends ScreenCenteredDialog implements ActionListener "Cka3o4Huk", "Frank Dietrich", "Bernd Eckenfels", + "Matt Foulks", "Ryan Gardner", "Martin Geldmacher", "Neil Gentleman", diff --git a/src/main/java/com/tagtraum/perf/gcviewer/view/GCDocument.java b/src/main/java/com/tagtraum/perf/gcviewer/view/GCDocument.java index a5897360..87dacec1 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/view/GCDocument.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/view/GCDocument.java @@ -4,8 +4,7 @@ import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Point; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; +import java.awt.event.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; diff --git a/src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGui.java b/src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGui.java index 0b153e8a..a4617b1e 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGui.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGui.java @@ -4,6 +4,8 @@ import javax.swing.*; import java.awt.*; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; import java.beans.PropertyVetoException; import java.util.ArrayList; import java.util.List; @@ -27,7 +29,6 @@ public class GCViewerGui extends JFrame { public GCViewerGui() { super("tagtraum industries incorporated - GCViewer"); - setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); } diff --git a/src/main/java/com/tagtraum/perf/gcviewer/view/ModelChartImpl.java b/src/main/java/com/tagtraum/perf/gcviewer/view/ModelChartImpl.java index 58f86266..b7675ad6 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/view/ModelChartImpl.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/view/ModelChartImpl.java @@ -11,10 +11,7 @@ import javax.swing.event.ChangeListener; import javax.swing.event.SwingPropertyChangeSupport; import java.awt.*; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; +import java.awt.event.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.DateFormat; @@ -185,6 +182,26 @@ private void maybePopup(MouseEvent e) { } }); + + addMouseWheelListener(new MouseWheelListener() { + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + if (((e.getModifiersEx() & InputEvent.META_DOWN_MASK) != 0 && System.getProperty("os.name").contains("Mac OS X"))||(e.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0 && !System.getProperty("os.name").contains("Mac OS X")) { + double pos = (double)(getHorizontalScrollBar().getValue()) / (double)(chart.getWidth()); + if (e.getWheelRotation() > 0 && getScaleFactor() < 100) { + setScaleFactor((getScaleFactor()*1.2)); + } + if (e.getWheelRotation() < 0 && getScaleFactor() > 0.01) { + setScaleFactor((getScaleFactor()/1.2)); + } + if (e.getWheelRotation() != 0) { + getHorizontalScrollBar().setValue((int)(pos * (double)(chart.getWidth()))); + e.consume(); + } + } + } + }); + } public void addTimeOffsetChangeListener(PropertyChangeListener listener) { From 531982025299de5f79e33c42c47d19bd6b828e35 Mon Sep 17 00:00:00 2001 From: chewiebug Date: Wed, 1 Mar 2023 22:01:31 +0100 Subject: [PATCH 12/18] synchronize zoom dropdown with zooming via mousewheel --- .../ctrl/impl/GCDocumentController.java | 15 +-- .../impl/GCModelLoaderControllerImpl.java | 26 +++-- .../perf/gcviewer/view/GCDocument.java | 16 ++- .../perf/gcviewer/view/GCViewerGui.java | 13 +-- .../gcviewer/view/GCViewerGuiToolBar.java | 27 ++++- .../perf/gcviewer/view/ModelChartImpl.java | 100 ++++++++++++------ .../view/model/PropertyChangeEventConsts.java | 12 ++- 7 files changed, 150 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/tagtraum/perf/gcviewer/ctrl/impl/GCDocumentController.java b/src/main/java/com/tagtraum/perf/gcviewer/ctrl/impl/GCDocumentController.java index 1d7f9bcc..baba18c2 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/ctrl/impl/GCDocumentController.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/ctrl/impl/GCDocumentController.java @@ -1,17 +1,18 @@ package com.tagtraum.perf.gcviewer.ctrl.impl; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.logging.Logger; +import javax.swing.SwingWorker; + import com.tagtraum.perf.gcviewer.ctrl.GCModelLoader; import com.tagtraum.perf.gcviewer.log.TextAreaLogHandler; import com.tagtraum.perf.gcviewer.view.ChartPanelView; import com.tagtraum.perf.gcviewer.view.GCDocument; import com.tagtraum.perf.gcviewer.view.GCModelLoaderView; +import com.tagtraum.perf.gcviewer.view.GCViewerGuiToolBar; import com.tagtraum.perf.gcviewer.view.ModelChartImpl; -import javax.swing.*; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.logging.Logger; - /** * Controller for {@link GCDocument}. * @@ -29,9 +30,11 @@ public GCDocumentController(GCDocument gcDocument) { gcDocument.addPropertyChangeListener(this); } - public void addGCResource(GCModelLoader loader, ViewMenuController viewMenuController) { + public void addGCResource(GCModelLoader loader, ViewMenuController viewMenuController, GCViewerGuiToolBar gcViewerGuiToolBar) { ChartPanelView chartPanelView = new ChartPanelView(gcDocument.getPreferences(), loader.getGcResource()); + ((ModelChartImpl)chartPanelView.getModelChart()).addPropertyChangeListener(gcDocument); ((ModelChartImpl)chartPanelView.getModelChart()).addPropertyChangeListener(viewMenuController); + ((ModelChartImpl)chartPanelView.getModelChart()).addPropertyChangeListener(gcViewerGuiToolBar); ((ModelChartImpl)chartPanelView.getModelChart()).addTimeOffsetChangeListener(new TimeOffsetPanelController(gcDocument)); gcDocument.addChartPanelView(chartPanelView); loader.addPropertyChangeListener(this); diff --git a/src/main/java/com/tagtraum/perf/gcviewer/ctrl/impl/GCModelLoaderControllerImpl.java b/src/main/java/com/tagtraum/perf/gcviewer/ctrl/impl/GCModelLoaderControllerImpl.java index 8d98ba27..dcc279bd 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/ctrl/impl/GCModelLoaderControllerImpl.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/ctrl/impl/GCModelLoaderControllerImpl.java @@ -1,25 +1,29 @@ package com.tagtraum.perf.gcviewer.ctrl.impl; +import java.awt.dnd.DnDConstants; +import java.awt.dnd.DropTarget; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeListener; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import javax.swing.JCheckBoxMenuItem; + import com.tagtraum.perf.gcviewer.ctrl.GCModelLoader; import com.tagtraum.perf.gcviewer.ctrl.GCModelLoaderController; import com.tagtraum.perf.gcviewer.ctrl.GCModelLoaderGroupTracker; import com.tagtraum.perf.gcviewer.ctrl.impl.FileDropTargetListener.DropFlavor; -import com.tagtraum.perf.gcviewer.model.GcResourceFile; import com.tagtraum.perf.gcviewer.model.GCResource; +import com.tagtraum.perf.gcviewer.model.GcResourceFile; import com.tagtraum.perf.gcviewer.model.GcResourceSeries; import com.tagtraum.perf.gcviewer.view.GCDocument; import com.tagtraum.perf.gcviewer.view.GCViewerGui; import com.tagtraum.perf.gcviewer.view.GCViewerGuiMenuBar; import com.tagtraum.perf.gcviewer.view.model.RecentGCResourcesModel; -import javax.swing.*; -import java.awt.dnd.DnDConstants; -import java.awt.dnd.DropTarget; -import java.awt.event.ActionListener; -import java.beans.PropertyChangeListener; -import java.io.File; -import java.util.*; - /** * Controller class for {@link GCModelLoader}. * @@ -70,7 +74,7 @@ public void add(List gcResourceList) { private void addGCResource(GCResource gcResource) { GCModelLoader loader = GCModelLoaderFactory.createFor(gcResource); GCDocumentController docController = getDocumentController(gcViewerGui.getSelectedGCDocument()); - docController.addGCResource(loader, getViewMenuController()); + docController.addGCResource(loader, getViewMenuController(), gcViewerGui.getToolBar()); loader.execute(); } @@ -125,7 +129,7 @@ private void openGCResource(GCResource gcResource, GCModelLoader loader) { gcViewerGui.addDocument(document); GCDocumentController docController = new GCDocumentController(document); - docController.addGCResource(loader, getViewMenuController()); + docController.addGCResource(loader, getViewMenuController(), gcViewerGui.getToolBar()); loader.execute(); } diff --git a/src/main/java/com/tagtraum/perf/gcviewer/view/GCDocument.java b/src/main/java/com/tagtraum/perf/gcviewer/view/GCDocument.java index 87dacec1..e4dd9dc2 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/view/GCDocument.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/view/GCDocument.java @@ -4,13 +4,13 @@ import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Point; -import java.awt.event.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; - import javax.swing.BoundedRangeModel; import javax.swing.DefaultBoundedRangeModel; import javax.swing.JInternalFrame; @@ -25,13 +25,14 @@ import com.tagtraum.perf.gcviewer.model.GCResource; import com.tagtraum.perf.gcviewer.view.model.GCPreferences; import com.tagtraum.perf.gcviewer.view.model.GCResourceGroup; +import com.tagtraum.perf.gcviewer.view.model.PropertyChangeEventConsts; /** * GCDocument. * * @author Hendrik Schreiber */ -public class GCDocument extends JInternalFrame { +public class GCDocument extends JInternalFrame implements PropertyChangeListener { private static final Logger LOGGER = Logger.getLogger(GCDocument.class.getName()); @@ -124,7 +125,7 @@ else if (ChartPanelView.EVENT_CLOSED.equals(event.getPropertyName())) { */ private int removeChartPanelView(ChartPanelView chartPanelView) { chartPanelViews.remove(chartPanelView); - + final int nChartPanelViews = chartPanelViews.size(); if (nChartPanelViews > 0) { relayout(); @@ -292,6 +293,13 @@ public boolean isWatched() { return watched; } + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals(PropertyChangeEventConsts.MODELCHART_SCALEFACTOR_CHANGED)) { + modelChartListFacade.setScaleFactor((Double) evt.getNewValue()); + } + } + private static class MasterViewPortChangeListener implements ChangeListener { private List slaveViewPorts = new ArrayList(); diff --git a/src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGui.java b/src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGui.java index a4617b1e..7f7c0d6c 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGui.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGui.java @@ -1,15 +1,16 @@ package com.tagtraum.perf.gcviewer.view; -import com.tagtraum.perf.gcviewer.view.model.GCPreferences; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; +import java.awt.BorderLayout; import java.beans.PropertyVetoException; import java.util.ArrayList; import java.util.List; import java.util.Map; +import javax.swing.Action; +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; + +import com.tagtraum.perf.gcviewer.view.model.GCPreferences; /** * This is the main window of GCViewer. diff --git a/src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGuiToolBar.java b/src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGuiToolBar.java index 263fcec4..02b7e79b 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGuiToolBar.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGuiToolBar.java @@ -1,16 +1,21 @@ package com.tagtraum.perf.gcviewer.view; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import javax.swing.JComboBox; import javax.swing.JToggleButton; import javax.swing.JToolBar; +import com.tagtraum.perf.gcviewer.view.model.PropertyChangeEventConsts; + /** * Toolbar for {@link GCViewerGui}. * * @author Joerg Wuethrich *

    created on: 11.02.2014

    */ -public class GCViewerGuiToolBar extends JToolBar { +public class GCViewerGuiToolBar extends JToolBar implements PropertyChangeListener { private JToggleButton watchToggle; private JComboBox zoomComboBox; @@ -32,4 +37,24 @@ public JToggleButton getWatchToggleButton() { public JComboBox getZoomComboBox() { return zoomComboBox; } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals(PropertyChangeEventConsts.MODELCHART_SCALEFACTOR_CHANGED)) { + // don't fire change event to prevent updating twice + updateWithoutFiringActionEvent(getZoomComboBox(), () -> getZoomComboBox().setSelectedItem(Math.round((double)evt.getNewValue() * 1000.0) + "%")); + } + } + + private void updateWithoutFiringActionEvent(final JComboBox comboBox, final Runnable runnable) { + final ActionListener[] actionListeners = comboBox.getActionListeners(); + for (final ActionListener listener : actionListeners) + comboBox.removeActionListener(listener); + try { + runnable.run(); + } finally { + for (final ActionListener listener : actionListeners) + comboBox.addActionListener(listener); + } + } } diff --git a/src/main/java/com/tagtraum/perf/gcviewer/view/ModelChartImpl.java b/src/main/java/com/tagtraum/perf/gcviewer/view/ModelChartImpl.java index b7675ad6..a3d49a24 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/view/ModelChartImpl.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/view/ModelChartImpl.java @@ -1,17 +1,19 @@ package com.tagtraum.perf.gcviewer.view; -import com.tagtraum.perf.gcviewer.model.GCModel; -import com.tagtraum.perf.gcviewer.util.TimeFormat; -import com.tagtraum.perf.gcviewer.view.model.GCPreferences; -import com.tagtraum.perf.gcviewer.view.model.PropertyChangeEventConsts; -import com.tagtraum.perf.gcviewer.view.renderer.*; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.event.SwingPropertyChangeSupport; -import java.awt.*; -import java.awt.event.*; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Rectangle; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.event.InputEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.DateFormat; @@ -20,6 +22,33 @@ import java.time.ZonedDateTime; import java.util.Date; import java.util.logging.Logger; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollBar; +import javax.swing.JScrollPane; +import javax.swing.JViewport; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.SwingPropertyChangeSupport; + +import com.tagtraum.perf.gcviewer.model.GCModel; +import com.tagtraum.perf.gcviewer.util.TimeFormat; +import com.tagtraum.perf.gcviewer.view.model.GCPreferences; +import com.tagtraum.perf.gcviewer.view.model.PropertyChangeEventConsts; +import com.tagtraum.perf.gcviewer.view.renderer.ConcurrentGcBegionEndRenderer; +import com.tagtraum.perf.gcviewer.view.renderer.FullGCLineRenderer; +import com.tagtraum.perf.gcviewer.view.renderer.GCRectanglesRenderer; +import com.tagtraum.perf.gcviewer.view.renderer.GCTimesRenderer; +import com.tagtraum.perf.gcviewer.view.renderer.IncLineRenderer; +import com.tagtraum.perf.gcviewer.view.renderer.InitialMarkLevelRenderer; +import com.tagtraum.perf.gcviewer.view.renderer.PolygonChartRenderer; +import com.tagtraum.perf.gcviewer.view.renderer.TotalHeapRenderer; +import com.tagtraum.perf.gcviewer.view.renderer.TotalTenuredRenderer; +import com.tagtraum.perf.gcviewer.view.renderer.TotalYoungRenderer; +import com.tagtraum.perf.gcviewer.view.renderer.UsedHeapRenderer; +import com.tagtraum.perf.gcviewer.view.renderer.UsedTenuredRenderer; +import com.tagtraum.perf.gcviewer.view.renderer.UsedYoungRenderer; +import com.tagtraum.perf.gcviewer.view.util.OSXSupport; /** * Graphical chart of the gc file. It contains the chart and all rulers surrounding it but not @@ -183,21 +212,25 @@ private void maybePopup(MouseEvent e) { }); - addMouseWheelListener(new MouseWheelListener() { - @Override - public void mouseWheelMoved(MouseWheelEvent e) { - if (((e.getModifiersEx() & InputEvent.META_DOWN_MASK) != 0 && System.getProperty("os.name").contains("Mac OS X"))||(e.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0 && !System.getProperty("os.name").contains("Mac OS X")) { - double pos = (double)(getHorizontalScrollBar().getValue()) / (double)(chart.getWidth()); - if (e.getWheelRotation() > 0 && getScaleFactor() < 100) { - setScaleFactor((getScaleFactor()*1.2)); - } - if (e.getWheelRotation() < 0 && getScaleFactor() > 0.01) { - setScaleFactor((getScaleFactor()/1.2)); - } - if (e.getWheelRotation() != 0) { - getHorizontalScrollBar().setValue((int)(pos * (double)(chart.getWidth()))); - e.consume(); - } + addMouseWheelListener(mouseWheelEvent -> { + if ((!OSXSupport.isOSX() && (mouseWheelEvent.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0) + || (OSXSupport.isOSX() && (mouseWheelEvent.getModifiersEx() & InputEvent.META_DOWN_MASK) != 0)) { + + double pos = (double)(getHorizontalScrollBar().getValue()) / (double)(chart.getWidth()); + double oldScaleFactor = getScaleFactor(); + if (mouseWheelEvent.getWheelRotation() > 0 && getScaleFactor() < 100) { + setScaleFactor((getScaleFactor()*1.2)); + } + if (mouseWheelEvent.getWheelRotation() < 0 && getScaleFactor() > 0.001) { + setScaleFactor((getScaleFactor()/1.2)); + } + if (mouseWheelEvent.getWheelRotation() != 0) { + getHorizontalScrollBar().setValue((int)(pos * (double)(chart.getWidth()))); + mouseWheelEvent.consume(); + } + + if (Math.abs(getScaleFactor() - oldScaleFactor) > 0.000001) { + fireScaleFactorChangedEvent(oldScaleFactor, getScaleFactor()); } } }); @@ -241,9 +274,10 @@ public void setScaleFactor(double scaleFactor) { this.scaleFactor = scaleFactor; chart.setSize(chart.getPreferredSize()); chart.resetPolygons(); - memoryRuler.setSize((int)memoryRuler.getPreferredSize().getWidth(), getViewport().getHeight()); - pauseRuler.setSize((int)pauseRuler.getPreferredSize().getWidth(), getViewport().getHeight()); - timestampRuler.setSize((int)(getViewport().getWidth()*getScaleFactor()), (int)timestampRuler.getPreferredSize().getHeight()); + memoryRuler.setSize((int) memoryRuler.getPreferredSize().getWidth(), getViewport().getHeight()); + pauseRuler.setSize((int) pauseRuler.getPreferredSize().getWidth(), getViewport().getHeight()); + timestampRuler.setSize((int) (getViewport().getWidth() * getScaleFactor()), + (int) timestampRuler.getPreferredSize().getHeight()); repaint(); } @@ -785,4 +819,10 @@ public void propertyChange(PropertyChangeEvent evt) { } } + private void fireScaleFactorChangedEvent(double oldScaleFactor, double scaleFactor) { + firePropertyChange(PropertyChangeEventConsts.MODELCHART_SCALEFACTOR_CHANGED, + oldScaleFactor, + scaleFactor); + } + } diff --git a/src/main/java/com/tagtraum/perf/gcviewer/view/model/PropertyChangeEventConsts.java b/src/main/java/com/tagtraum/perf/gcviewer/view/model/PropertyChangeEventConsts.java index 61ef1d41..acb0d938 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/view/model/PropertyChangeEventConsts.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/view/model/PropertyChangeEventConsts.java @@ -23,7 +23,16 @@ public interface PropertyChangeEventConsts { *

    newValue: dateStamp is shown now (boolean) */ String MODELCHART_TIMESTAMP_RULER_FORMAT_CHANGED = "modelchartTimestampRulerFormatChanged"; - + + /** + * used to indicate that the scaleFactor of the modelchart was changed + * + *

    Parameters: + *

    oldValue: scaleFactor before + *

    newValue: scaleFactor after + */ + String MODELCHART_SCALEFACTOR_CHANGED = "modelchartScaleFactorChanged"; + /** * Used to indicate that the state of the date / checkbox in the * {@link com.tagtraum.perf.gcviewer.view.TimeOffsetPanel} has changed @@ -33,4 +42,5 @@ public interface PropertyChangeEventConsts { *

    newValue: checkbox state now */ String TIMEOFFSETPANEL_STATE_CHANGED = "timeoffsetpanelStateChanged"; + } From a40952fab6db20ed5f6336199cfceae49824660a Mon Sep 17 00:00:00 2001 From: chewiebug Date: Wed, 1 Mar 2023 22:04:15 +0100 Subject: [PATCH 13/18] some small cleanup --- .bettercodehub.yml | 3 --- LICENSE.txt | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 .bettercodehub.yml diff --git a/.bettercodehub.yml b/.bettercodehub.yml deleted file mode 100644 index 6a8c6cc9..00000000 --- a/.bettercodehub.yml +++ /dev/null @@ -1,3 +0,0 @@ -component_depth: 8 -languages: -- java diff --git a/LICENSE.txt b/LICENSE.txt index 1367045d..83035f03 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,7 +1,7 @@ GCViewer helps you to analyse java garbage collection log files. Copyright (c) 2002-2008 tagtraum industries incorporated. -Copyright (c) 2011-2021 Joerg Wuethrich and contributors +Copyright (c) 2011-2023 Joerg Wuethrich and contributors LGPL ==== From af97692884ac918ccbdf7a123fa698460a1d397e Mon Sep 17 00:00:00 2001 From: chewiebug Date: Sun, 5 Mar 2023 16:51:13 +0100 Subject: [PATCH 14/18] #264 improve parsing of jdk 17 serial gc logs --- .../imp/DataReaderUnifiedJvmLogging.java | 2 +- .../gcviewer/imp/TestDataReaderUJLSerial.java | 6 ++- .../imp/TestDataReaderUJLSerialJdk17.java | 49 +++++++++++++++++++ 3 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderUJLSerialJdk17.java diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java index 47489aa2..5ebeed0c 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java @@ -108,7 +108,7 @@ public class DataReaderUnifiedJvmLogging extends AbstractDataReader { // Group 6: 4998 // Group 7: M // Group 8: 2.872 (optional group) - private static final Pattern PATTERN_MEMORY_PAUSE = Pattern.compile("^" + PATTERN_MEMORY_STRING + "(?:(?:[ ]" + PATTERN_PAUSE_STRING + ")|$)"); + private static final Pattern PATTERN_MEMORY_PAUSE = Pattern.compile("^" + PATTERN_MEMORY_STRING + "(?:(?:[ ]" + PATTERN_PAUSE_STRING + ")|$)?"); private static final int GROUP_MEMORY = 1; private static final int GROUP_MEMORY_BEFORE = 2; diff --git a/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderUJLSerial.java b/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderUJLSerial.java index 633c5140..add1aad2 100644 --- a/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderUJLSerial.java +++ b/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderUJLSerial.java @@ -107,8 +107,10 @@ public void testParseUnknownLineFormat() throws Exception { DataReader reader = new DataReaderUnifiedJvmLogging(gcResource, in); GCModel model = reader.read(); - assertThat("number of warnings", handler.getCount(), is(1)); - assertThat("warning message", handler.getLogRecords().get(0).getMessage(), startsWith("Expected memory and pause in the end of line number")); + assertThat("number of warnings", handler.getCount(), is(0)); + assertThat("memory before", model.get(0).getPreUsed(), is(124928)); + assertThat("memory before", model.get(0).getPostUsed(), is(115712)); + assertThat("memory before", model.get(0).getTotal(), is(131072)); } @Test diff --git a/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderUJLSerialJdk17.java b/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderUJLSerialJdk17.java new file mode 100644 index 00000000..aac3a835 --- /dev/null +++ b/src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderUJLSerialJdk17.java @@ -0,0 +1,49 @@ +package com.tagtraum.perf.gcviewer.imp; + +import static org.hamcrest.Matchers.closeTo; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.logging.Level; + +import com.tagtraum.perf.gcviewer.model.AbstractGCEvent.Type; +import com.tagtraum.perf.gcviewer.model.GCModel; +import com.tagtraum.perf.gcviewer.model.GCResource; +import com.tagtraum.perf.gcviewer.model.GcResourceFile; +import org.junit.Test; + +/** + * Tests unified jvm logging parser for serial gc events. + */ +public class TestDataReaderUJLSerialJdk17 { + + @Test + public void testStandardEvent() throws Exception { + TestLogHandler handler = new TestLogHandler(); + handler.setLevel(Level.WARNING); + GCResource gcResource = new GcResourceFile("byteArray"); + gcResource.getLogger().addHandler(handler); + InputStream in = new ByteArrayInputStream( + ("[2023-03-05T15:03:14.411+0000][0.276s][info][gc,start ] GC(0) Pause Young (Allocation Failure)\n" + + "[2023-03-05T15:03:14.415+0000][0.280s][info][gc,heap ] GC(0) DefNew: 8703K(9792K)->1088K(9792K) Eden: 8703K(8704K)->0K(8704K) From: 0K(1088K)->1088K(1088K)\n" + + "[2023-03-05T15:03:14.415+0000][0.281s][info][gc,heap ] GC(0) Tenured: 0K(21888K)->6627K(21888K)\n" + + "[2023-03-05T15:03:14.416+0000][0.281s][info][gc,metaspace] GC(0) Metaspace: 309K(512K)->309K(512K) NonClass: 293K(384K)->293K(384K) Class: 16K(128K)->16K(128K)\n" + + "[2023-03-05T15:03:14.416+0000][0.282s][info][gc ] GC(0) Pause Young (Allocation Failure) 8M->7M(30M) 5.480ms\n" + + "[2023-03-05T15:03:14.416+0000][0.282s][info][gc,cpu ] GC(0) User=0.00s Sys=0.00s Real=0.01s\n" + + "[2023-03-05T15:03:14.417+0000][0.282s][info][safepoint ] Safepoint \"GenCollectForAllocation\", Time since last: 209726300 ns, Reaching safepoint: 51400 ns, At safepoint: 6279300 ns, Total: 6330700 ns\n" + ).getBytes()); + + DataReader reader = new DataReaderUnifiedJvmLogging(gcResource, in); + GCModel model = reader.read(); + + assertThat("number of warnings", handler.getCount(), is(0)); + assertThat("number of events", model.size(), is(1)); + assertThat("event type", model.get(0).getExtendedType().getType(), is(Type.UJL_PAUSE_YOUNG)); + assertThat("event pause", model.get(0).getPause(), closeTo(0.00548, 0.0000001)); + + assertThat("phases", model.getGcEventPhases().size(), is(0)); + } + +} From 6940be095958b4786fbd2e0cfe74511512a9049a Mon Sep 17 00:00:00 2001 From: MaysWind Date: Wed, 26 Apr 2023 00:54:18 +0800 Subject: [PATCH 15/18] support all of ujl decorators, allow log only contains time or uptime --- .../imp/DataReaderUnifiedJvmLogging.java | 110 ++++- .../imp/TestDataReaderUJLDecorations.java | 387 ++++++++++++++++++ 2 files changed, 476 insertions(+), 21 deletions(-) create mode 100644 src/test/java/com/tagtraum/perf/gcviewer/imp/TestDataReaderUJLDecorations.java diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java index 5ebeed0c..62a321fe 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java @@ -3,6 +3,9 @@ import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -29,13 +32,13 @@ /** * DataReaderUnifiedJvmLogging can parse all gc events of unified jvm logs with default decorations. *

    - * Currently needs the "gc" selector with "info" level and "uptime,level,tags" decorators (Java 9.0.1). + * Currently needs the "gc" selector with "info" level and "uptime,level,tags" (or "time,level,tags") decorators (Java 9.0.1). * Also supports "gc*" selector with "trace" level and "time,uptime,level,tags" decorators, but will ignore some of * the debug and all trace level info (evaluates the following tags: "gc", "gc,start", "gc,heap", "gc,metaspace". *

      *
    • minimum configuration with defaults supported: -Xlog:gc:file="path-to-file"
    • - *
    • explicit minimum configuration needed: -Xlog:gc=info:file="path-to-file":tags,uptime,level
    • - *
    • maximum detail configuration this parser is able to work with: -Xlog:gc*=trace:file="path-to-file":tags,time,uptime,level
    • + *
    • explicit minimum configuration needed: -Xlog:gc=info:file="path-to-file":uptime,level,tags or -Xlog:gc=info:file="path-to-file":time,level,tags
    • + *
    • maximum detail configuration this parser is able to work with: -Xlog:gc*=trace:file="path-to-file":time,uptime,timemillis,uptimemillis,timenanos,uptimenanos,pid,tid,level,tags
    • *
    * Only processes the following information format for Serial, Parallel, CMS, G1 and Shenandoah algorithms, everything else is ignored: *
    @@ -51,28 +54,56 @@ public class DataReaderUnifiedJvmLogging extends AbstractDataReader {
         // TODO also parse "Allocation Stall (main)" events
     
         // matches the whole line and extracts decorators from it (decorators always appear between [] and are independent of the gc algorithm being logged)
    -    // Input: [0.693s][info][gc           ] GC(0) Pause Init Mark 1.070ms
    -    // Group 1 / time:  (optional group, no full timestamp present)
    -    // Group 2 / uptime: 0.693 (optional group, present in this example)
    -    // Group 3 / level: info
    -    // Group 4 / tags: gc
    -    // Group 5 / gcnumber: 0
    -    // Group 6 / tail: Pause Init Mark 1.070ms
    -    // Regex: ^(?:\[(?