{"id":13591334,"url":"https://github.com/chewiebug/GCViewer","last_synced_at":"2025-04-08T14:33:22.960Z","repository":{"id":39174111,"uuid":"2629978","full_name":"chewiebug/GCViewer","owner":"chewiebug","description":"Fork of tagtraum industries' GCViewer. Tagtraum stopped development in 2008, I aim to improve support for Sun's / Oracle's java 1.6+ garbage collector logs (including G1 collector)","archived":false,"fork":false,"pushed_at":"2023-06-20T20:34:57.000Z","size":6744,"stargazers_count":4460,"open_issues_count":82,"forks_count":978,"subscribers_count":269,"default_branch":"develop","last_synced_at":"2024-10-29T14:59:54.373Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://github.com/chewiebug/GCViewer/wiki","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chewiebug.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2011-10-23T09:01:04.000Z","updated_at":"2024-10-28T07:20:03.000Z","dependencies_parsed_at":"2023-01-31T00:45:52.975Z","dependency_job_id":"59ae1624-82a1-4151-97f6-ac93d16ae584","html_url":"https://github.com/chewiebug/GCViewer","commit_stats":{"total_commits":683,"total_committers":57,"mean_commits":"11.982456140350877","dds":0.260614934114202,"last_synced_commit":"af97692884ac918ccbdf7a123fa698460a1d397e"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chewiebug%2FGCViewer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chewiebug%2FGCViewer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chewiebug%2FGCViewer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chewiebug%2FGCViewer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chewiebug","download_url":"https://codeload.github.com/chewiebug/GCViewer/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247861188,"owners_count":21008443,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T16:00:56.233Z","updated_at":"2025-04-08T14:33:17.943Z","avatar_url":"https://github.com/chewiebug.png","language":"Java","readme":"GCViewer 1.36\n=============\n\n[![Build Status](https://app.travis-ci.com/chewiebug/GCViewer.svg?branch=develop)](https://app.travis-ci.com/chewiebug/GCViewer)\n[![codecov.io](https://codecov.io/github/chewiebug/GCViewer/coverage.svg?branch=develop)](https://codecov.io/github/chewiebug/GCViewer?branch=develop)\n[![Download gcviewer](https://img.shields.io/sourceforge/dm/gcviewer.svg)](https://sourceforge.net/projects/gcviewer/files)\n\nGCViewer is a little tool that visualizes verbose GC output\ngenerated by Sun / Oracle, IBM, HP and BEA Java Virtual Machines. It\nis free software released under GNU LGPL.\n\nYou can start GCViewer (gui) by simply double-clicking on gcviewer-1.3x.jar\nor running java -jar gcviewer-1.3x.jar (it needs a java 1.8 vm to run).\n\nFor a cmdline based report summary just type the following to generate a report (including optional chart image file): \n`java -jar gcviewer-1.3x.jar gc.log summary.csv [chart.png] [-t PLAIN|CSV|CSV_TS|SIMPLE|SUMMARY]`\nWhen logfile rotation (-XX:+UseGCLogFileRotation) is enabled, the logfiles can be read at once: \n`java -jar gcviewer-1.3x.jar gc.log.0;gc.log.1;gc.log.2;gc.log.current summary.csv [chart.png] [-t PLAIN|CSV|CSV_TS|SIMPLE|SUMMARY]`\n\n\nSupported verbose:gc formats are:\n\n- some support for OpenJDK 9 / 10 unified logging format -Xlog:gc:\u003cfile\u003e, the following configurations will work\n  - -Xlog:gc:file=\"path-to-file\" (uses defaults)\n  - -Xlog:gc=info:file=\"path-to-file\":tags,uptime,level (minimum configuration needed)\n  - -Xlog:gc*=trace:file=\"path-to-file\":tags,time,uptime,level\n    (maximum configuration supported, additional tags ok, but ignored; additional decorations will break parsing)\n- Oracle JDK 1.8 -Xloggc:\u003cfile\u003e [-XX:+PrintGCDetails] [-XX:+PrintGCDateStamps]\n- Sun / Oracle JDK 1.7 with option -Xloggc:\u003cfile\u003e [-XX:+PrintGCDetails] [-XX:+PrintGCDateStamps]\n- Sun / Oracle JDK 1.6 with option -Xloggc:\u003cfile\u003e [-XX:+PrintGCDetails] [-XX:+PrintGCDateStamps]\n- Sun JDK 1.4/1.5 with the option -Xloggc:\u003cfile\u003e [-XX:+PrintGCDetails]\n- Sun JDK 1.2.2/1.3.1/1.4 with the option -verbose:gc\n- IBM JDK 1.3.1/1.3.0/1.2.2 with the option -verbose:gc\n- IBM iSeries Classic JVM 1.4.2 with option -verbose:gc\n- HP-UX JDK 1.2/1.3/1.4.x with the option -Xverbosegc\n- BEA JRockit 1.4.2/1.5/1.6 with the option -verbose:memory [-Xverbose:gcpause,gcreport] [-Xverbosetimestamp]\n\nBest results for non unified gc logging Oracle JDKs are achieved with: -Xloggc:\u003cfile\u003e -XX:+PrintGCDetails -XX:+PrintGCDateStamps.\nA few other options are supported, but most of the information generated is ignored by GCViewer\n(the javadoc introduction of \nhttps://github.com/chewiebug/GCViewer/blob/master/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0.java\nshows the details).\n\nHendrik Schreiber wrote GCViewer up to 1.29. What you are seeing here is based \non his very good work.\nLinks to detailed descriptions of many JVM parameters relevant to garbage collection\ncan be found in the links section of https://github.com/chewiebug/GCViewer/wiki\n\nResults of log analysis\n=======================\nThere are two sections, where the results of the log analysis are shown.\nOne is the left side with the chart, the other the data panel on the right side.\nIn the following, the content of these sections is explained.\n\nChart\n-----\n\nGCViewer shows a number of lines etc. in a chart (first tab). These are:\n\n- Full GC Lines:\n  - Black vertical line at every Full GC\n- Inc GC Lines:\n  - Cyan vertical line at every Incremental GC\n- GC Times Line:\n  - Green line that shows the length of all GCs\n- GC Times Rectangles:\n  - black rectangle at every Full GC\n  - blue rectangle at every initial mark event\n  - orange rectangle at every remark event\n  - red rectangle at every vm operation event (\"application stopped...\")\n  - Grey rectangle at every 'normal' GC\n  - Light grey rectangle at every Incremental GC\n- Total Heap:\n  - Red line that shows heap size\n- Tenured Generation:\n  - Magenta area that shows the size of the tenured generation\n      (not available without PrintGCDetails)\n- Young Generation:\n  - Orange area that shows the size of the young generation \n      (not available without PrintGCDetails)\n- Used Heap:\n  - Blue line that shows used heap size\n- Initial mark level:\n  - Yellow line that shows the heap usage at \"initial-mark\" event \n      (only available when the gc algorithm uses concurrent \n      collections, which is the case for CMS and G1)\n- Concurrent collections\n  - Cyan vertical line for every begin (concurrent-mark-start) \n      and pink vertical line for every end (CMS-concurrent-reset /\n      G1: concurrent-cleanup-end) of a concurrent collection cycle\n\nEvent details\n-------------\nIn the second tab it shows details about the events it parsed:\nE.g. events like the following\n\n24.187: [GC 24.188: [ParNew: 93184K-\u003e5464K(104832K), 0.0442895 secs] \\\n93184K-\u003e5464K(1036928K), 0.0447149 secs] \\\n[Times: user=0.39 sys=0.07, real=0.05 secs]\n\nare shown in one line as\nGC ParNew: \u003cnumber of events parsed\u003e, \u003cmin duration\u003e, \u003cmax duration\u003e...\n\nEvents like these\n\n4183.962: [Full GC 4183.962: [CMS: 32957K-\u003e40326K(932096K), 2.3313389 secs] \\\n76067K-\u003e40326K(1036928K), [CMS Perm : 43837K-\u003e43453K(43880K)], 2.3339606 secs] \\\n[Times: user=2.33 sys=0.01, real=2.33 secs] \n \nare shown as\nFull GC; CMS; CMS Perm \u003cnumber of events parsed\u003e ...\n\nSo for every line the text is extracted (not always every part of it). This allows\na user which is familiar with the text log files to find out more details about\nthe events that occurred.\n\n### median, 75th...\nThese columns show the median, 75th percentile etc.\n\n### Gc pauses\nThis are shows all stop-the-world pauses, that are not full gc pauses.\n\n### Full gc pauses\nIn this area all pauses are shown, which GCViewer considers as \"full gc\"\npauses. The current definition of a \"full gc\" is: Either the gc algorithm\nprints \"full gc\" in its event name, or more than one generation (young,\nold, permgen / metaspace) were involved during collection.\n\n### VM operations overhead (safepoint pauses)\nThis area is only shown, if the gc log was written with the option\n-XX:+PrintGCApplicationStoppedTime. To understand the meaning of this\nmetric, it is important to know about safepoints (see e.g.\nhttp://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html).\n\nIf GCViewer finds gc log lines like the following:\n2017-03-29T14:37:12.812+0200: 8.832: [GC (Allocation Failure) \\\n  [PSYoungGen: 29146K-\u003e3457K(29184K)] 78228K-\u003e52539K(116736K), 0.0009340 secs] \\\n  [Times: user=0.00 sys=0.00, real=0.00 secs]\n2017-03-29T14:37:12.813+0200: 8.833: Total time for which application \\\n  threads were stopped: 0.0010682 seconds, Stopping threads took: 0.0000155 seconds\n\nGCViewer will report one event in the \"Gc pauses\" area and one in this area.\nThe pause duration reported for \"Total time...\" will be 0.0001342s\n(0.0010682 (duration of safepoint pause) - 0.0009340 (duration of gc pause))\nSo GCViewer only calculates the additional overhead needed for the whole\nsafepoint on top of the gc pause.\n\nIf the event immediately before the \"Total time...\" event was not a any\nkind of gc pause, but another \"Total time...\" event, then the whole pause\nfor \"Total time...\" will be recorded for this event. In this case the\nsafepoint was not caused by a gc pause.\n\n### Concurrent GCs\nThis are contains information about concurrent collection cycles, if\nthe gc algorithm used them. The time reported here is spent while the\napplication threads are running. It is possible to read here, how long\nconcurrent gc operations took until they finished.\n\nParser\n------\nIn the third tab the output of the parser is shown. If there were warnings\nduring the parsing process or other output, you can check there.\n\nData Panel\n==========\nGCViewer provides some metrics to help you interpret the chart.\nNote that some metrics based on averages are shown along with\ntheir standard deviation. If it is obvious that the standard\ndeviation is fairly big in comparison to the average, the values\nare grayed out, indicating that actual values are much smaller\nor bigger than the average.\n\nSummary\n-------\n\n- Footprint:\n  - Maximal amount of memory allocated\n- Max heap after conc GC:\n  - Max used heap after concurrent gc.\n- Max tenured after conc GC:\n  - Max used tenured heap after concurrent gc \n    (followed by % of max tenured / % of max total heap).\n- Max heap after full GC:\n  - Max used heap after full gc. Indicates max live object \n      size and can help to determine heap size.\n- Freed Memory:\n  - Total amount of memory that has been freed\n- Freed Mem/Min:\n  - Amount of memory that has been freed per minute\n- Total Time:\n  - Time data was collected for (only if timestamp was present in log)\n- Acc Pauses:\n  - Sum of all pauses due to GC\n- Throughput:\n  - Time percentage the application was NOT busy with GC\n- Full GC Performance:\n  - Performance of full collections. Note that all collections \n      that include a collection of the tenured generation or are \n      marked with \"Full GC\" are considered Full GC.\n- GC Performance:\n  - Performance of minor collections. These are collections that \n      are not full according to the definition above.\n\nMemory\n------\n\n- Total heap (usage / alloc max):\n  - Max memory usage / allocation in total heap (the last \n    is the same as \"footprint\" in Summary)\n- Tenured heap (usage / alloc max):\n  - Max memory usage / allocation in tenured space\n- Young heap (usage / alloc max):\n  - Max memory usage / allocation in young space\n- Perm heap (usage / alloc max):\n  - Max memory usage / allocation in perm space\n- Max tenured after conc GC:\n  - see in \"summary\" section\n- Avg tenured after conc GC:\n  - average size of tenured heap after concurrent collection\n- Max heap after conc GC:\n  - see in \"summary\" section\n- Avg heap after conc GC:\n  - average size of concurrent heap after concurrent collection\n- Max heap after full GC:\n  - see in \"summary\" section\n- Avg after full GC:\n  - The average heap memory consumption after a full collection\n- Avg after GC:\n  - The average heap memory consumption after a minor collection\n- Freed Memory:\n  - Total amount of memory that has been freed\n- Freed by full GC:\n  - Amount of memory that has been freed by full collections\n- Freed by GC:\n  - Amount of memory that has been freed by minor collections\n- Avg freed full GC:\n  - Average amount of memory that has been freed by full collections\n- Avg freed GC:\n  - Average amount of memory that has been freed by minor\n      collections\n- Avg rel inc after FGC:\n  - Average relative increase in memory consumption between full \n      collections. This is the average difference between the memory \n      consumption after a full collection to the memory consumption \n      after the next full collection.\n- Avg rel inc after GC:\n  - Average relative increase in memory consumption between minor \n      collections. This is the average difference between the\n      memory consumption after a minor collection to the memory\n      consumption after the next minor collection. This can be used\n      as an indicator for the amount of memory that survives\n      minor collections and has to be moved to the survivor spaces\n      or the tenured generation. This value added to \"Avg freed GC\"\n      gives you an idea about the size of the young generation in case\n      you don't have PrintGCDetails turned on.\n- Slope full GC:\n  - Slope of the regression line for the memory consumption after\n      full collections. This can be used as an indicator for the\n      increase in indispensable memory consumption (base footprint)\n      of an application over time.\n- Slope GC:\n  - Average of the slope of the regression lines for the memory\n      consumption after minor collections in between full collections.\n      That is, if you have two full collections and many minor\n      collections in between, GCViewer will calculate the slope for\n      the minor collections up to the first full collection, then the\n      slope of the minor collections between the first and the second\n      full collection. Then it will compute a weighted average (each\n      slope wil be weighted with the number of measuring points it was\n      computed with).\n- initiatingOccFraction (avg / max)\n  - CMS GC kicks in before tenured generation is filled.\n      InitiatingOccupancyFraction tells you the avg / max usage in % of the\n      tenured generation, when CMS GC started (initial mark).\n      This value can be set manually using \n      -XX:CMSInitiatingOccupancyFraction=\u003cvalue\u003e. \n- avg promotion\n  - Promotion means the size of objects that are promoted from young\n      to tenured generation during a young generation collection.\n      Avg promotion shows the average amount of memory that is promoted\n      from young to tenured with each young collection (only available\n      with PrintGCDetails)\n- total promotion\n  - Total promotion shows the total amount of memory that is promoted\n      from young to tenured with all young collections in a file (only \n      available with PrintGCDetails)\n\n\nPause\n-----\n\n- Acc Pauses:\n  - Sum of all pauses due to any kind of GC\n- Number of Pauses:\n  - Count of all pauses due to any kind of GC\n- Avg Pause:\n  - Average length of a GC pause of any kind\n- Min / max Pause:\n  - Shortest /longest pause of any kind\n- Avg pause interval:\n  - avg interval between two pauses of any kind\n- Min / max pause interval:\n  - Min / max interval between two pauses of any kind\n  \n* * *\n- Acc full GC:\n  - Sum of all pauses due to full collections\n- Number of full GC pauses:\n  - Count of all pauses due to full collections\n- Acc GC:\n  - Sum of all full GC pauses\n- Avg full GC:\n  - Average length of a full GC pause\n- Min / max full GC pause:\n  - Shortest / longest full GC pause\n- Min / max full GC pause interval:\n  - Min / max interval between two pauses due to full collections\n  \n* * *\n- Acc GC:\n  - Sum of all pauses due to minor collections\n- Number of GC pauses:\n  - Count of all pauses due to minor collections\n- Avg GC:\n  - Average length of a minor collection pause\n- Min / max GC pause:\n  - Shortest / longest minor GC pause\n\n\nNotes\n=====\n\nThis is not a perfect tool. However, GCViewer can help you\ngetting a grip on finding out what's going on in your application\nwith regards to garbage collection.\n\nHere are some known limitations.\n\n\nIBM JDKs\n--------\n\nIf you have problems with the IBM format, please check that\nevery line of information is really in one line and not wrapped.\n\nThe IBM format actually provides a lot more information than is\nvisualized.\n\n\nSun JDK 1.3.1/1.4 with -verbose:gc\n----------------------------------\n\nSun JDK 1.3.1/1.4 with -verbose:gc does not provide a timestamp.\nTherefore values like 'Total Time', 'Throughput', and 'Freed Mem/Min'\ncannot be calculated.\n\n\nSun / Oracle JDK 1.6 / 1.7 / 1.8 (a.k.a. Java 6 / 7 / 8)\n---------------------------\n\nCMS and G1 collector sometimes mix concurrent events with stop the world \ncollections in the output. In some cases the parser can recover from \nsuch mixed lines, sometimes it can't and will show an error message.\n\n\nBEA JRockit 1.4.2/1.5/1.6\n-------------------------\n\nConcurrently collected garbage may not be reflected correctly in the\ndata panel.\n\nExport formats\n--------------\n**CSV** Comma Separated Values\nThe CSV format is quite useful for importing the data to a\nspreadsheet application. However, it does not export all\ndata.\n\n**CSV_TS** Comma Separated Values\nCSV format using unix timestamp and one line per gc event.\n\n**PLAIN** Plain Data\nPlain text representation of the gc log. If written from Sun / Oracle gc log\nit is usually compatible with HPjmeter.\n\n**SIMPLE** Simple GC Log\nVery simple representation of a gc log in the format\n\u003cname of event\u003e \u003csecondes since start of log\u003e \u003cpause time\u003e.\nThis format is compatible with gchisto (http://java.net/projects/gchisto)\n\n**SUMMARY**\nDetailed summary exporting all details about a gc log file (same as shown in data panel). \n\nInternationalization\n--------------------\n\nProvided are a German, an English and a Swedish localStrings.properties\nfile. If someone feels the need to translate these to another\nlanguage, please do so. I will be more than glad, to include it\nin a future version of this tool.\n\n\nStart of log / absolute times\n-----------------------------\n\nIf you happen to know when the application and GC log was started, you\ncan specify this time by right-clicking on the time ruler and entering\na start time.\nSun / Oracle VMs: If -XX:+PrintGCDateStamps was used, the proposed start time is \nread from the gc log file.\n\nBug reports\n-----------\n\nIf you are a developer, you may fork (http://help.github.com/fork-a-repo/)\nthe repository on http://github.com/chewiebug/GCViewer and send me a \npull request (http://help.github.com/send-pull-requests/). If you plan a bigger \nchange I'd appreciate a notice in advance.\n\nTo file a bug report, please open an issue on \nhttp://github.com/chewiebug/GCViewer/issues or send an email to \ngcviewer-info@googlegroups.com with a description of the error, the \nname of the JVM that produced the GC data and all used flags along \nwith a sample GC log file.\n\n\nBuilding GCViewer from Source\n-----------------------------\n\nDownload and install Maven3 from http://maven.apache.org/\nDownload the src distribution of GCViewer.\nExecute from the GCViewer base directory (same as pom.xml):\n\n    mvn clean install\n\nThe executable jar will be placed in the target directory.\n\n\nEnjoy!\n\nJoerg Wuethrich  \nhttp://github.com/chewiebug/GCViewer  \ngcviewer@gmx.ch\n","funding_links":[],"categories":["Java","V. Tools for developing","Profilers"],"sub_categories":["3. Perfomance tools"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchewiebug%2FGCViewer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchewiebug%2FGCViewer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchewiebug%2FGCViewer/lists"}