Giter Site home page Giter Site logo

microsoft / gctoolkit Goto Github PK

View Code? Open in Web Editor NEW
1.2K 41.0 147.0 1.89 MB

Tool for parsing GC logs

Home Page: https://github.com/microsoft/gctoolkit

License: MIT License

Java 99.97% Dockerfile 0.03%
java gc performance jvm heap memory memory-management

gctoolkit's Introduction

Microsoft GCToolKit

GCToolkit is a set of libraries for analyzing HotSpot Java garbage collection (GC) log files. The toolkit parses GC log files into discrete events and provides an API for aggregating data from those events. This allows the user to create arbitrary and complex analyses of the state of managed memory in the Java Virtual Machine (JVM) represented by the garbage collection log.

For more detail you can read our Launch Blog Post.

GCToolKit build with Maven


Introduction

Managed memory in the Java Virtual Machine (JVM) is composed of 3 main pieces:

  1. Memory buffers known as Java heap
  2. Allocators which perform the work of getting data into Java heap
  3. Garbage Collection (GC).

While GC is responsible for recovering memory in Java heap that is no longer in use, the term is often used as a euphemism for memory management. The phrasing of Tuning GC or tuning the collector are often used with the understanding that it refers to tuning the JVMโ€™s memory management subsystem. The best source of telemetry data for tuning GC comes from GC Logs and GCToolKit has been helpful in making this task easier by providing parsers, models and an API to build analytics with. You can run the Maven project HeapOccupancyAfterCollectionSummary sample as an example of this.

Usage

In order to use this library you'll need to add its dependencies to your project. We provide the instructions for Maven below.

Maven Coordinates

Maven Central

The GCToolKit artifacts are in Maven Central. You'll then need to add the api, parser and vertx modules to your project in the dependencyManagement and/or dependencies section as you see fit.

<dependencies>
    ...
    
    <dependency>
        <groupId>com.microsoft.gctoolkit</groupId>
        <artifactId>api</artifactId>
        <version>3.0.4</version>
    </dependency>
    
    <dependency>
        <groupId>com.microsoft.gctoolkit</groupId>
        <artifactId>parser</artifactId>
        <version>3.0.4</version>
    </dependency>
    
    <dependency>
        <groupId>com.microsoft.gctoolkit</groupId>
        <artifactId>vertx</artifactId>
        <version>3.0.4</version>
    </dependency>

    ...
</dependencies>

User Discussions

Meet other developers working with GCToolKit, ask questions, and participate in the development of this project by visiting the Discussions tab.

Example

See the sample project: sample/README

Contributing

See CONTRIBUTING for full details including more options for building and testing the project.

Test Coverage Report

Core API Coverage
Coverage

Core :: Parser
Coverage::Core::Parser

Core :: Vertx
Coverage::Core::Parser

License

Microsoft GCToolKit is licensed under the MIT license.

gctoolkit's People

Contributors

actions-user avatar anantk24 avatar brunoborges avatar dependabot[bot] avatar dreamlettuce avatar dsgrieve avatar j-bahr avatar jkost avatar kabutz avatar karianna avatar kcpeppe avatar kgeis avatar leveretconey avatar loyispa avatar marchof avatar microsoft-github-operations[bot] avatar microsoftopensource avatar pliakas avatar rokon12 avatar shubhammishra14550 avatar slowy07 avatar sormuras avatar suboptimal avatar zhangshushu123 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gctoolkit's Issues

Create a 'contributor' profile

Create a profile that can be used by a contributor to run tests and checks. This would make it easy for someone who just wants to fork and build but not contribute. The default profile would not run tests or checks.

One of the biggest benefits of this is that we could avoid having to download the gclog test data for a casual user. The default profile would set skipTests and skipUnpack to true. The contributor profile would set these to false.

NPE in UnifiedGCLogParser#noop and possibly elsewhere

    void noop() {
        if (System.getProperty("microsoft.debug").equalsIgnoreCase("true"))
            System.out.println("noop");
    }

s/System.getProperty/Boolean.getBoolean/ and get rid of the equalsIgnoreCase

Another pattern that shows up is
debugging = ("true".equals(System.getProperty("microsoft.debug", "false").toLowerCase()));

There are some 19 uses of System.getProperty that need to be inspected.

G1GCForward reference is cumbersome

G1GCForwardReference grew organically and needs to be looked at to see if it could be refactored into something more extensible. One thought is to have a G1GCForwardReference interface with specific implementation for the different patterns. But this may lead to unwanted casting.

test -Pcontributor does not work anymore

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:3.2.0:unpack (download-test-logs) on project gctoolkit: Unable to find/resolve artifact.: com.microsoft.gctoolkit:gctoolkit-gclogs:zip:1.0.2 was not found in https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of central has elapsed or updates are forced -> [Help 1]

Parser rules improvements

Currently the parser sends a log line through a set of (regex) rules to identify it to know how to safely process it. The proposal is to replace the list with a circular buffer in hopes that for well formed log files, the "next" log line will be the "next" rule which should hopefully reduce the number of rules to try before getting a hit. The worst case is still run to failure, failure being, the log line being passed in isn't recognized.

Adding Test Coverage Report, Static Code Analysis & Code Style Check

I would recommend to add the following tools

Test Coverage

I would be useful to add JaCoCo in order to have a test coverage report and in the future set the limits for test coverage. It can be also enabled in the build pipelines.

Static code Analysis

Maybe also some static code analysis tool, such as Spotbugs

Code style

Adding also support to Checkstyle based on predefined code style

ParallelJVMConfigurationTest is failing

[INFO] Running com.microsoft.gctoolkit.parser.test.diary.ParallelJVMConfigurationTest
[ERROR] Tests run: 6, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 3.675 s <<< FAILURE! - in com.microsoft.gctoolkit.parser.test.diary.ParallelJVMConfigurationTest
[ERROR] com.microsoft.gctoolkit.parser.test.diary.ParallelJVMConfigurationTest.testForDetailsTenuring  Time elapsed: 1.136 s  <<< FAILURE!
org.opentest4j.AssertionFailedError: ps/details/tenuring/p_app_02_gc.log.zip, calculated: false, expected: true ==> expected: <true> but was: <false>
        at [email protected]/com.microsoft.gctoolkit.parser.test.diary.ParallelJVMConfigurationTest.testForDetailsTenuring(ParallelJVMConfigurationTest.java:37)

Compiler Warnings with -X:lint switched on

These aren't necessarily bugs, but we should look into them:

[INFO] Compiling 99 source files to /Users/karianna/Documents/workspace/microsoft/gctoolkit/core/api/target/classes
[WARNING] /Users/karianna/Documents/workspace/microsoft/gctoolkit/core/api/src/main/java/com/microsoft/gctoolkit/aggregator/JVMEventDispatcher.java:[49,72] unchecked cast
  required: java.lang.Class<? extends com.microsoft.gctoolkit.event.jvm.JVMEvent>
  found:    java.lang.Class<capture#1 of ? super capture#2 of ? extends com.microsoft.gctoolkit.event.jvm.JVMEvent>
[WARNING] /Users/karianna/Documents/workspace/microsoft/gctoolkit/core/api/src/main/java/com/microsoft/gctoolkit/aggregator/JVMEventDispatcher.java:[65,60] unchecked cast
  required: java.util.function.Consumer<com.microsoft.gctoolkit.event.jvm.JVMEvent>
  found:    java.util.function.Consumer<capture#3 of ? super R>

and

[INFO] Changes detected - recompiling the module!
[INFO] Compiling 66 source files to /Users/karianna/Documents/workspace/microsoft/gctoolkit/core/parser/target/classes
[WARNING] /Users/karianna/Documents/workspace/microsoft/gctoolkit/core/parser/src/main/java/com/microsoft/gctoolkit/parser/collection/MRUQueue.java:[26,33] unchecked cast
  required: K
  found:    java.lang.Object

sample.sh missing / no easy way to run the sample

mvn clean install exec:java in the sample directory doesn't run the Main class. The sample.sh file mentioned in the blog is not there and it's complicated to figure out how to run the Main class using the module system.

Architecture Document and Diagram(s)

In order to help contributors understand how and where they can add, extend, refactor, etc. I think a minimum is:

  • A description of each package/layer and its responsibilities.
  • Any major 'Why' explanations for design patterns or implementations that may not be obvious to a new contributor.
  • A picture speaks a thousand words.

Perhaps other things.

Update README to make Hotspot support clearer

Hi everyone!

Thanks for sharing such a great tool! I would love to try it, but it seems that it is only compatible with HotSpot JVMs.
Consider this sentence from your README:

GCToolKit is a set of libraries for analyzing Java garbage collection (GC) log files

It should probably be:

GCToolKit is a set of libraries for analyzing Hotspot Java garbage collection (GC) log files

I know MS' JVM is yet another hotspot distribution like 99% of the other JVMs out there, but OpenJ9 does have a significant use case and is typically used in conjunction with OpenLiberty.

Many thanks,
- Ben

Originally posted by @bmarwell in #20

Please add Tag/Relase for 2.0.1

According to documentation there is a release 2.0.1. But it does now show as a tag and therefore also not a the latest release on GitHub.

As a user it would be nice to directly see the latest release in the GitHub landing page and also know the tree version which belong to that release.

Add API to support parsers

Currently the API doesn't have direct support for parsing. The proposal is to add that support to API so that some of the slightly confusing code in the parser module can be cleaned up. For example, there is a JVMConfiguration implements a JVMConfiguration and also wraps a JVMConfiguration.

StringDeduplication events should not be G1 specific

StringDeduplication events should not be G1 specific and be at least enabled for Shenandoah. I read they should be enabled for Serial GC, Parallel GC and ZGC as well but at least with Zulu17.28+13-CA this was not working.

java -XX:+UseStringDeduplication -XX:+UseParallelGC -XX:+PrintFlagsFinal -version  | grep String
java -XX:+UseStringDeduplication -XX:+UseSerialGC -XX:+PrintFlagsFinal -version  | grep String
java -XX:+UseStringDeduplication -XX:+UseShenandoahGC -XX:+PrintFlagsFinal -version  | grep String
java -XX:+UseStringDeduplication -XX:+UseZGC -XX:+PrintFlagsFinal -version  | grep String

Example file: shenandoah.log

Generated with:

-Xlog:gc*,stringdedup*=debug,gc+ref=debug,gc+age=trace,safepoint:file=shenandoah.log:time,level,tags

Stable Clock API

The API should offer a stable view of time as recorded in the GC log.

mvn test fails

Not sure if you're fully released yet, but mvn test currently fails:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:3.1.1:unpack (download-test-logs) on project gctoolkit: Unable to find/resolve artifact.: Failed to read artifact descriptor for com.microsoft.gctoolkit:gctoolkit-gclogs:zip:1.0.1: Could not transfer artifact com.microsoft.gctoolkit:gctoolkit-gclogs:pom:1.0.1 from/to github (https://maven.pkg.github.com/microsoft/*): authentication failed for https://maven.pkg.github.com/microsoft/*/com/microsoft/gctoolkit/gctoolkit-gclogs/1.0.1/gctoolkit-gclogs-1.0.1.pom, status: 401 Unauthorized -> [Help 1]

Define Checkstyle and PMD rules

Above changes will not break in github workflow. But we add following commands in workflow, this will fail workflow, we might to have correct error first.

  • mvn checkstyle:check
    Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.1.2:check (default-cli) on project api: You have 2838 Checkstyle violations
  • mvn spotbugs:check
    Failed to execute goal com.github.spotbugs:spotbugs-maven-plugin:4.3.0:check (default-cli) on project api: failed with 81 bugs and 0 errors

Ah I see - so we need to define the project stds for checkstyle and PMD! :-)

Originally posted by @karianna in #33 (comment)

mvn site fails

Lots to unpick here.

Martijns-MSFT-MacBook-Pro:gctoolkit karianna$ mvn site
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] GCToolKit                                                          [pom]
[INFO] core                                                               [pom]
[INFO] api                                                                [jar]
[INFO] parser                                                             [jar]
[INFO] vertx                                                              [jar]
[INFO] sample                                                             [jar]
[INFO]
[INFO] -----------------< com.microsoft.gctoolkit:gctoolkit >------------------
[INFO] Building GCToolKit 2.0.1-SNAPSHOT                                  [1/6]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-site-plugin:3.3:site (default-site) @ gctoolkit ---
[WARNING] Report plugin org.apache.maven.plugins:maven-project-info-reports-plugin has an empty version.
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[INFO] configuring report plugin org.apache.maven.plugins:maven-project-info-reports-plugin:3.0.0
[WARNING] Error injecting: org.apache.maven.report.projectinfo.CiManagementReport
java.lang.NoClassDefFoundError: org/apache/maven/doxia/siterenderer/DocumentContent
    at java.lang.Class.getDeclaredConstructors0 (Native Method)
    at java.lang.Class.privateGetDeclaredConstructors (Class.java:3137)
    at java.lang.Class.getDeclaredConstructors (Class.java:2357)
...

Rethink GCToolKit API flow: GCAnalyzer returns GCAnalysis

For discussion:

Bruno and I had a discussion about this API in general. It was very refreshing to have his un-initiated perspective here. One of the ideas he tossed into the ring was having an 'analyzer' API, to which my response was that is what GCToolkit is.

Later, I got to thinking about it and I see where he's coming from. I think, perhaps, we should rename the GCToolKit class to GCAnalyzer, and have the analyze method return a GCAnalysis which would be what JavaVirtualMachine is now. I think this would make it more clear to the user what to do and what to use.

Thoughts?

Originally posted by @dsgrieve in #70 (comment)

Rename module names to start with `com.microsoft.`

As requestd by @brunoborges https://twitter.com/brunoborges/status/1423503746995298304 ๐Ÿ˜‰

Rename module names to start with com.microsoft., in order to follow the reverse-DNS style pattern. Find more information and detailed reasonings here: https://blog.joda.org/2017/04/java-se-9-jpms-module-naming.html

Nice side-effect: their Maven coordinates will be automatically mapped by https://github.com/sormuras/modules

Deliverables:

  • Rename main module names and their usages (i.e. requires directives)
    • From gctoolkit.api to com.microsoft.gctoolkit.api
    • From gctoolkit.parser to com.microsoft.gctoolkit.parser
    • From gctoolkit.vertx to com.microsoft.gctoolkit.vertx
  • Update test modules to read new main module names
  • Rename test module names
  • Rename sample module from gctoolkit.sample to com.microsoft.gctoolkit.sample
  • Update module snippet here https://devblogs.microsoft.com/java/introducing-microsoft-gctoolkit

Remove auto loading aggregators

I'm not sure why we're removing this feature. To not have autoloading affects the ability to clients to load queries without modifying code. Can we put this into an issue where we can discuss it further

Originally posted by @kcpeppe in #70 (comment)

Tests should run by default

Currently tests do not run by default due to issues with how the test data is being managed. Once that issue is solved, tests should run by default.

Handle clock rollbacks

Currently in Censum, the expectation is a monotonically increasing clock value. In reality, clocks are not monotonic and in those cases the clock can travel backwards. This leads to potential errors in downstream calculations. ATM there isn't much that can be done with this except detect it and offer a warning. The NTP RFC specifies jumps of approximately 100ms. NTP favours forward jumps and as it happens, this is the most common use case (generally due to local thermal conditions in the pizza box).

In other cases this is simply a case of log corruption. The most common case is that two separate GC logs have been concatenated together. In this case the most sensible thing to do would to offer a warning that the clock rollbacked back and then halt the parsing.

Github Packages not available

Hi, thanks for starting this project! I'm really looking forward to make use of it soon :)

It looks like the Github package URL (https://maven.pkg.github.com/microsoft/*) is wrong, no packages available at this time. Right? Can you pleas point me to the actual repository. Preferably Maven Central :)

Thanks,
-marc

Make DateTimeStamp implement Comparable

The use-case is that of a being able to order by date/time a collection of data items extracted from a GC event. DateTimeStamp does have API that allow it to be compared in various ways, but it does not implement Comparable. This makes it difficult to create a sortable, abstract data set (for example DataSet<X extends Comparable, Y extends Comparable) that can use DateTimeStamp.

estimate start time for log fragments

In cases where the toolkit is offered log fragment, calculate a sensible start time. The calculations routinely assume that the logs start at 0.00 seconds which is not true in this case.

The hard question is, what defines a log fragment from a complete log.. IOWs how far from 0.00 seconds do we need to be before we estimate a start time.

Upgrade vert.x dependencies to 4.1.5

vert.x 4.1.2 pulls in netty 4.1.65.final which has a DOS security vulnerability. The code involved is never executed by gctoolkit, but this does cause issues for dependency verification. vert.x 4.1.5 depends on netty 4.1.68.final which does not have the vulnerability.

After this upgrade, a new release of gctoolkit should be created.

References:
https://github.com/netty/netty/blob/netty-4.1.67.Final/codec/src/main/java/io/netty/handler/codec/compression/SnappyFrameDecoder.java#L79
https://github.com/netty/netty/blob/netty-4.1.67.Final/codec/src/main/java/io/netty/handler/codec/compression/SnappyFrameDecoder.java#L171
https://github.com/netty/netty/blob/netty-4.1.67.Final/codec/src/main/java/io/netty/handler/codec/compression/SnappyFrameDecoder.java#L185

Clarify and configure merge strategy for main branch

The main branch is the one with the history which is kept "forever". Therefore I recommend having a clean and readable history. Currently the default configuration for this repository seems to be "merge" for PRs. This results in additional (useless) merge commits for every PR:

image

I recommend to allow and configure "rebase and merge" only for the main branch, which gives a nice linear history. See for example: https://github.com/jacoco/jacoco/commits/master

image

To enforce this you can check "Require linear history" for main in the "Braches" configuration.

API to support message backplane

Currently an Aggregator/Aggregation provider has to export the implementations to the vertx module. The goal is to eliminate this by adding message bus support to the API and converting the vertx module to be a supplier to this API. Making this move should allow us to clean up the vertx module.

mvn site plugin fails with an NPE on license report generation

To reproduce uncomment the license plugin in the reporting section and run mvnw site

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.7.1:site (default-site) on project gctoolkit: Execution default-site of goal org.apache.maven.plugins:maven-site-plugin:3.7.1:site failed.: NullPointerException -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.7.1:site (default-site) on project gctoolkit: Execution default-site of goal org.apache.maven.plugins:maven-site-plugin:3.7.1:site failed.
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:972)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:293)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:196)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:566)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: org.apache.maven.plugin.PluginExecutionException: Execution default-site of goal org.apache.maven.plugins:maven-site-plugin:3.7.1:site failed.
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:148)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:972)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:293)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:196)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:566)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: java.lang.NullPointerException
    at java.util.HashSet.<init> (HashSet.java:119)
    at org.codehaus.mojo.license.api.ResolvedProjectDependencies.<init> (ResolvedProjectDependencies.java:50)
    at org.codehaus.mojo.license.AbstractThirdPartyReportMojo.createThirdPartyDetails (AbstractThirdPartyReportMojo.java:559)
    at org.codehaus.mojo.license.AggregatorThirdPartyReportMojo.createThirdPartyDetails (AggregatorThirdPartyReportMojo.java:127)
    at org.codehaus.mojo.license.AbstractThirdPartyReportMojo.executeReport (AbstractThirdPartyReportMojo.java:420)
    at org.apache.maven.reporting.AbstractMavenReport.generate (AbstractMavenReport.java:251)
    at org.apache.maven.plugins.site.render.ReportDocumentRenderer.renderDocument (ReportDocumentRenderer.java:230)
    at org.apache.maven.doxia.siterenderer.DefaultSiteRenderer.render (DefaultSiteRenderer.java:349)
    at org.apache.maven.plugins.site.render.SiteMojo.renderLocale (SiteMojo.java:198)
    at org.apache.maven.plugins.site.render.SiteMojo.execute (SiteMojo.java:147)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:972)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:293)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:196)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:566)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
    ```

G1ConcurrentStringDeduplication lacks unit

G1ConcurrentStringDeduplication doesn't have any comments so it's a bit hard to make sense of. It currently has

  • startingStringVolume: double
  • endingStringVolume: double
  • reduction: double
  • percentReduction: double

All these are double and not long without any comments. It is unclear if the values are in bytes, in which case long would be more appropriate see MemoryPoolSummary, or in a unit, if so what the unit is.

For percentReduction it is unclear whether 100 % is represented as 100.0d or 1.0d.

Cleanup POM files for publication

Using PomChecker to verify the structure of a POM file, yields the following outputs:

for GCToolkit's root POM file

[ERROR] The POM file
[ERROR] /Users/kirk/Projects/github/gctoolkit/pom.xml
[ERROR] cannot be uploaded to Maven Central due to the following reasons:
[ERROR]  * <version> can not be -SNAPSHOT.
[ERROR]  * The <repositories> block should not be present.

Related to #80

For GCToolkit/core/api POM file

[WARNING] <name> is not defined in POM. Will use value from parent: 
        GCToolKit
[WARNING] <description> is not defined in POM. Will use value from parent: 
        GC log parsing utilities
[WARNING] <url> is not defined in POM. Will use computed value from parent: 
        https://github.com/Microsoft/gctoolkit/core/api

Decide which values for <name>, <description>, <url> should be use for child projects.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.