Skip to content

[Bug]: large numbers of dependencies exhaust heap memory during dependency resolution #596

Description

@estekhin

Hi!

I am trying to switch from xolstice/protobuf-maven-plugin to ascopes/protobuf-maven-plugin, but getting some unexpected results.

Our setup:

  • a separate "proto" project with a lot of proto files which generates a bunch of artifacts with generated class files and embedded proto files
  • the "main" multi-module project that depends on proto-project artifacts as necessary, with a couple of modules that have their own proto files

I have configured <embedSourcesInClassOutputs>true</embedSourcesInClassOutputs> because it matches the default xolstice behaviour.

Most modules are OK after switching to ascopes.
Some modules that both have their own proto files and depend on a lot of proto-project artifacts cause OOME.

-X log looks like this:

[INFO] --- protobuf:2.12.1:generate (generate) @ unlucky-module ---
...
[DEBUG] Configuring mojo execution 'io.github.ascopes:protobuf-maven-plugin:2.12.1:generate:generate' with basic configurator -->
...
[DEBUG] Resolving artifact: MavenDependency{groupId=com.google.protobuf, artifactId=protoc, version=3.25.5, type=exe, classifier=linux-x86_64, dependencyResolutionDepth=null, exclusions=[]}
[DEBUG] Resolved extension exe to Aether artifact type (classifier: "", type: "exe", id: "exe", "{language=none, constitutesBuildPath=false, type=exe, includesDependencies=false}")
[INFO] Resolving artifact com.google.protobuf:protoc:exe:linux-x86_64:3.25.5 from repositories
[DEBUG] Discovering all compilable protobuf source files
[DEBUG] Attempting to resolve the following dependencies in this pass: []
...
// a long list of unlucky-module dependencies goes here
[DEBUG] Resolving project dependency: Dependency {groupId=..., artifactId=..., version=..., type=...}
...
[DEBUG] Attempting to resolve the following dependencies in this pass: [non-empty list, contains unlucky-module dependencies]

at this point the log "stops" for some time, and then fails with

[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  03:31 min (Wall Clock)
[INFO] Finished at: 2025-03-17T16:10:36+03:00
[INFO] ------------------------------------------------------------------------
[ERROR] Java heap space -> [Help 1]
java.lang.OutOfMemoryError: Java heap space
    at java.util.ArrayList.grow (ArrayList.java:240)
    at java.util.ArrayList.grow (ArrayList.java:245)
    at java.util.ArrayList.add (ArrayList.java:484)
    at java.util.ArrayList.add (ArrayList.java:497)
    at org.eclipse.aether.resolution.VersionRangeResult.addVersion (VersionRangeResult.java:116)
    at org.eclipse.aether.internal.impl.collect.DataPool$Constraint.toResult (DataPool.java:352)
    at org.eclipse.aether.internal.impl.collect.DataPool.getConstraint (DataPool.java:227)
    at org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate.cachedResolveRangeResult (DependencyCollectorDelegate.java:404)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:202)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doRecurse (DfDependencyCollector.java:343)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:277)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doRecurse (DfDependencyCollector.java:343)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:277)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doRecurse (DfDependencyCollector.java:343)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:277)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doRecurse (DfDependencyCollector.java:343)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:277)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doRecurse (DfDependencyCollector.java:343)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:277)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
    at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doRecurse (DfDependencyCollector.java:343)

This is the only stacktrace it reports, and there are no plugin-related packages or classes in the stacktrace.

I have tried to use <dependencyResolutionDepth>DIRECT</dependencyResolutionDepth>, but it results in the same OOME.

I have tried to use <ignoreProjectDependencies>true</ignoreProjectDependencies> - it kind of solves the problem, but it requires to specify <importDependencies> with duplicates of some project dependencies (and it seems it doesn't use dependency management and requires to specify the version explicitly, but that is a separate issue).

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingcan not reproduceThe issue cannot be reproduced right now by the development team.help neededAny expertise or time or resources will always be appreciated!

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions