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>
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...
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 forMAVEN_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.
I got same problem trying to compile "clean install" using a Lowend 512Mb ram VPS and good CPU. Run OutOfMemory and killed script repeatly.
I used export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"
and worked.
Still getting some other compiling failure because is the first time i need Maven, but OutOfMemory problem has gone.
Add option
-XX:MaxPermSize=512m
to MAVEN_OPTS
maven-compiler-plugin
options
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<fork>true</fork>
<meminitial>1024m</meminitial>
<maxmem>2024m</maxmem>
</configuration>
</plugin>
What type of OS are you running on?
In order to assign more than 2GB of ram it needs to be at least a 64bit OS.
Then there is another problem. Even if your OS has Unlimited RAM, but that is fragmented in a way that not a single free block of 2GB is available, you'll get out of memory exceptions too. And keep in mind that the normal Heap memory is only part of the memory the VM process is using. So on a 32bit machine you will probably never be able to set Xmx to 2048MB.
I would also suggest to set min an max memory to the same value, because in this case as soon as the VM runs out of memory the frist time 1GB is allocated from the start, the VM then allocates a new block (assuming it increases with 500MB blocks) of 1,5GB after that is allocated, it would copy all the stuff from block one to the new one and free Memory after that. If it runs out of Memory again the 2GB are allocated and the 1,5 GB are then copied, temporarily allocating 3,5GB of memory.
I got same problem when compiling Druid.io, increasing the MaxDirectMemorySize finally worked.
export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
This below configuration working in my case
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<argLine>-XX:MaxPermSize=500M</argLine>
</configuration>
</plugin>
Try to use -XX:MaxPermSize instead of -XX:MaxPermGen
_JAVA_OPTIONS="-Xmx3G" mvn clean install
While building the project on Unix/Linux platform, set Maven options syntax as below. Notice that single qoutation signs, not double qoutation.
export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
Using .mvn/jvm.config worked for me plus has the added benefit of being linked with the project.
This happens in big projects on Windows when cygwin or other linux emulator is used(git bash). By some coincidence, both does not work on my project, what is an big open source project. In a sh script, a couple of mvn commands are called. The memory size grows to heap size bigger that specified in Xmx and most of the time in a case second windows process is started. This is making the memory consumption even higher.
The solution in this case is to use batch file and reduced Xmx size and then the maven operations are successful. If there is interest I can reveal more details.
来源:https://stackoverflow.com/questions/12498738/maven-out-of-memory-build-failure