Сбой сборки java.lang.OutOfMemoryError: пространство кучи Java
Я столкнулся с этой проблемой при создании моего build.xml.
BUILD FAILED
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2786)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
at org.codehaus.cargo.module.DefaultJarArchive.<init>(DefaultJarArchive.
java:75)
at org.codehaus.cargo.module.DefaultJarArchive.<init>(DefaultJarArchive.
java:56)
at org.codehaus.cargo.module.webapp.DefaultWarArchive.<init>(DefaultWarA
rchive.java:69)
at org.apache.cactus.integration.ant.CactifyWarTask.addJarWithClass(Cact
ifyWarTask.java:652)
at org.apache.cactus.integration.ant.CactifyWarTask.addCactusJars(Cactif
yWarTask.java:627)
at org.apache.cactus.integration.ant.CactifyWarTask.execute(CactifyWarTa
sk.java:519)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
at sun.reflect.GeneratedMethodAccessor31.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.jav
a:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:62)
at net.sf.antcontrib.logic.IfTask.execute(IfTask.java:197)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.jav
a:106)
at org.apache.tools.ant.TaskAdapter.execute(TaskAdapter.java:154)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
at sun.reflect.GeneratedMethodAccessor31.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.jav
a:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:357)
at org.apache.tools.ant.Target.performTasks(Target.java:385)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
at org.apache.tools.ant.Project.executeTarget(Project.java:1306)
Ответы
Ответ 1
Похоже, вам нужно запустить JVM с большим ограничением памяти. Попробуйте что-нибудь вроде (если вы используете оболочку Bourne):
export ANT_OPTS=-Xmx1g
ant
или, если вы используете cmd
под Windows:
set ANT_OPTS=-Xmx1g
ant
Выше, 1g
означает 1 ГБ. Вы можете настроить это, как хотите; например, если вы хотите использовать 1,5 ГБ, вы можете использовать -Xmx1536m
.
Ответ 2
(для < Java 8, permgen не применяется к Java 8 и выше)
Для тех, кто получил аналогичную трассировку со словом "PermGen" в сообщении об ошибке,
java.lang.OutOfMemoryError: PermGen space
Увеличение пространства perm-gean в ANT_OPTS (желательно, хотя и не обязательно вместе с максимальным размером кучи) должно решить проблему
Пример
export ANT_OPTS="-Xmx2g -XX:MaxPermSize=512m"
Настройте номера в соответствии с вашими потребностями.
Ура!
Ответ 3
Если с опцией fork используется задача "javac", javac будет запускаться в своем собственном процессе, и память должна быть непосредственно назначена javac, используя "memoryinitialsize" и "memorymaximumsize":
javac srcdir="${src}"
destdir="${classes}"
source="1.6"
debug="true"
fork="true"
deprecation="off"
memoryinitialsize="512m"
memorymaximumsize="1024m"
Ответ 4
Вам нужно установить ANT_OPTS на следующий более высокий уровень в файле dx.bat.white находится \build-tools\versions\dx.bat.
set defaultXmx = -Xmx2048M Я установил его в 2 ГБ.