Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Maven Out of Memory Build Failure

As of today, my maven compile fails.

[INFO] [ERROR] Unexpected [INFO] java.lang.OutOfMemoryError: Java heap space [INFO]  at java.util.Arrays.copyOfRange(Arrays.java:2694) [INFO]  at java.lang.String.<init>(String.java:203) [INFO]  at java.lang.String.substring(String.java:1877) 

[ERROR] Out of memory; to increase the amount of memory, use the -Xmx flag at startup (java -Xmx128M ...)

As of yesterday I had successfully run a maven compile.

As of today, I just bumped up my heap to 3 GB. Also, I only changed 2-3 minor lines of code, so I don't understand this 'out of memory' error.

vagrant@dev:/vagrant/workspace$ echo $MAVEN_OPTS -Xms1024m -Xmx3000m -Dmaven.surefire.debug=-Xmx3000m 

EDIT: I tried the poster's comment by changing my failed module's pom.xml. But I got the same maven build error.

    <plugin>         <groupId>org.apache.maven.plugins</groupId>         <artifactId>maven-compiler-plugin</artifactId>         <configuration>             <source>1.5</source>             <target>1.5</target>             <fork>true</fork>             <meminitial>1024m</meminitial>             <maxmem>2024m</maxmem>        </configuration>     </plugin> 
like image 706
Kevin Meredith Avatar asked Sep 19 '12 16:09

Kevin Meredith


People also ask

How do I allocate more memory to Maven?

It is possible to start Maven and sbt with increased memory. We recommend you increase the Maximum Metaspace size and the Thread Stack size. These values can be set using -Xss2M -XX:MaxMetaspaceSize=1024M . The exact values may depend on your hardware and your code base.

How much memory does Maven use?

Once you have Maven installed in your system, the very next step is to fine-tune it for an optimal performance. By default, the maximum heap allocation is 512 MB, which starts from 256 MB ( -Xms256m to -Xmx512m ).

Why does Maven build failure in eclipse?

Try this: Eclipse IDE > Window > Show View > Maven Repositories > Local Repositories > Rebuild Index. Try cleaning and refreshing the project within eclipse. You might also have to delete that particular jar from your m2 repository and force maven to re-download it.


2 Answers

What kind of 'web' module are you talking about? Is it a simple war and has packaging type war?

If you are not using Google's web toolkit (GWT) then you don't need to provide any gwt.extraJvmArgs

Forking the compile process might be not the best idea, because it starts a second process which ignores MAVEN_OPTS altogether, thus making analysis more difficult.

So I would try to increase the Xmx by setting the MAVEN_OPTS

export MAVEN_OPTS="-Xmx3000m" 

And don't fork the compiler to a different process

<plugin>     <groupId>org.apache.maven.plugins</groupId>     <artifactId>maven-compiler-plugin</artifactId>     <configuration>         <source>1.5</source>         <target>1.5</target>    </configuration> </plugin> 

Increasing -XX:MaxPermSize=512m should not be required because if perm size is the reason of the problem, then I would expect the error java.lang.OutOfMemoryError: PermGen space

If that does not solve your problem, then you can create heap dumps for further analysis by adding -XX:+HeapDumpOnOutOfMemoryError. Additionally, you can use jconsole.exe in your java bin directory to connect to the jvm while the compilation is running and see what is going on inside the jvm's heap.

Another Idea (may be a stupid one) which came up to me, do you have enough RAM inside your machine? Defining the memory size is nice, but if your host has only 4GB and then you might have the problem that Java is not able to use the defined Memory because it is already used by the OS, Java, MS-Office...

like image 190
vach Avatar answered Sep 28 '22 10:09

vach


Answering late to mention yet another option rather than the common MAVEN_OPTS environment variable to pass to the Maven build the required JVM options.

Since Maven 3.3.1, you could have an .mvn folder as part of the concerned project and a jvm.config file as perfect place for such an option.

two new optional configuration files .mvn/jvm.config and .mvn/maven.config, located at the base directory of project source tree. If present, these files will provide default jvm and maven options. Because these files are part of the project source tree, they will be present in all project checkouts and will be automatically used every time the project is build.

As part of the official release notes

In Maven it is not simple to define JVM configuration on a per project base. The existing mechanism based on an environment variable MAVEN_OPTS and the usage of ${user.home}/.mavenrc is an other option with the drawback of not being part of the project.

Starting with this release you can define JVM configuration via ${maven.projectBasedir}/.mvn/jvm.config file which means you can define the options for your build on a per project base. This file will become part of your project and will be checked in along with your project. So no need anymore for MAVEN_OPTS, .mavenrc files. So for example if you put the following JVM options into the ${maven.projectBasedir}/.mvn/jvm.config file:

-Xmx2048m -Xms1024m -XX:MaxPermSize=512m -Djava.awt.headless=true 

The main advantage of this approach is that the configuration is isolated to the concerned project and applied to the whole build as well, and less fragile than MAVEN_OPTS for other developers working on the same project (forgetting to setting it).
Moreover, the options will be applied to all modules in case of a multi-module project.

like image 29
A_Di-Matteo Avatar answered Sep 28 '22 10:09

A_Di-Matteo