java.lang.OutOfMemoryError: пространство кучи Java в Maven

123

Когда я запускаю тест maven, возникает ошибка java.lang.OutOfMemoryError. Я искал решения в Google и пытался export MAVEN_OPTS=-Xmx1024m, но это не сработало. Кто-нибудь знает другие решения этой проблемы, кстати, я использую maven 3.0

заранее спасибо

Вставьте сюда сообщение об ошибке при запуске "mvn test -e"

Неудачные тесты:
  предупреждение (junit.framework.TestSuite $ 1)
  testDefaultPigJob_1 (com.snda.dw.pig.impl.DefaultPigJobLocalTest)
  testDefaultPigJob_2 (com.snda.dw.pig.impl.DefaultPigJobLocalTest)

Выполненных тестов: 11, сбоев: 3, ошибок: 0, пропущенных: 0

10/11/01 13:37:18 INFO executionengine.HExecutionEngine: подключение к hadoop fi
файловая система по адресу: file: ///
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
[ИНФОРМАЦИЯ] ОШИБКА СОЗДАНИЯ
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
[INFO] Общее время: 30.063 сек.
[ИНФОРМАЦИЯ] Окончание: Пн, 01 ноя, 13:37:18 PDT 2010
[ИНФОРМАЦИЯ] Конечная память: 3M / 6M
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
[ОШИБКА] Не удалось выполнить цель org.apache.maven.plugins: maven-surefire-plugin: 2.
5: тест (тест по умолчанию) в проекте dw.pig: есть ошибки тестирования.
[ОШИБКА]
[ОШИБКА] Пожалуйста, обратитесь к E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports fo
r результаты индивидуальных тестов.
[ОШИБКА] -> [Справка 1]
org.apache.maven.lifecycle.LifecycleExecutionException: не удалось выполнить цель o
rg.apache.maven.plugins: maven-surefire-plugin: 2.5: тест (тест по умолчанию) в проекте
 dw.pig: Есть ошибки при тестировании.

Пожалуйста, обратитесь к E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports для in
результаты индивидуальных тестов.
        в org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 199)
        в org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 148)
        в org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 140)
        в org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
кт (LifecycleModuleBuilder.java:84)
        в org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
кт (LifecycleModuleBuilder.java:59)
        в org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBu
ILD (LifecycleStarter.java:183)
        в org.apache.maven.lifecycle.internal.LifecycleStarter.execute (Lifecycl
eStarter.java:161)
        в org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:314)
        в org.apache.maven.DefaultMaven.execute (DefaultMaven.java:151)
        в org.apache.maven.cli.MavenCli.execute (MavenCli.java:445)
        в org.apache.maven.cli.MavenCli.doMain (MavenCli.java:168)
        в org.apache.maven.cli.MavenCli.main (MavenCli.java:132)
        в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод)
        в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.
Java: 39)
        в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAcces
sorImpl.java:25)
        в java.lang.reflect.Method.invoke (Method.java:597)
        в org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Laun
cher.java:290)
        в org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.jav
а: 230)
        в org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (La
uncher.java:409)
        в org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:
352)
Вызвано: org.apache.maven.plugin.MojoFailureException: есть сбои теста
,

Пожалуйста, обратитесь к E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports для in
результаты индивидуальных тестов.
        в org.apache.maven.plugin.surefire.SurefirePlugin.execute (SurefirePlugi
n.java:629)
        в org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (по умолчанию
BuildPluginManager.java:107)
        в org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 195)
        ... еще 19
[ОШИБКА]
[ОШИБКА] Перезапустите Maven, используя переключатель -X, чтобы включить полное ведение журнала отладки.
[ОШИБКА]
[ERROR] Для получения дополнительной информации об ошибках и возможных решениях, пожалуйста,
d следующие статьи:
[ОШИБКА] [Справка 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc
zjffdu
источник
Может у вас в тесте утечка памяти? Несмотря на это время сборки мусора, вы все еще можете создать утечку памяти в Java: ibm.com/developerworks/library/j-leaks
Anio

Ответы:

158

Когда я запускаю тест maven, возникает ошибка java.lang.OutOfMemoryError. Я поискал решения в Google и попытался экспортировать MAVEN_OPTS = -Xmx1024m, но это не сработало.

Настройка Xmxпараметров с помощью MAVEN_OPTSдействительно работает, она настраивает JVM, используемую для запуска Maven. Это , как сказано, Maven-безошибочный-плагин - Форкс новый JVM по умолчанию, и ваш MAVEN_OPTS, таким образом , не прошло.

Чтобы настроить размер JVM, используемого maven-surefire-plugin, вам необходимо либо:

  • измените значение forkModeна never(что не очень хорошая идея, потому что Maven не будет изолирован от теста) ~ или ~
  • используйте argLineпараметр (правильно):

В последнем случае примерно так:

<configuration>
  <argLine>-Xmx1024m</argLine>
</configuration>

Но я должен сказать, что я склонен согласиться со Стивеном в этом, очень вероятно, что что-то не так с одним из ваших тестов, и я не уверен, что увеличение объема памяти является правильным решением для «решения» (скрытия?) Вашей проблемы.

Ссылки

Паскаль Тивент
источник
1
Вы обновляете тег <configuration> только в родительском файле pom.xml?
Кевин Мередит
3
forkModeустарел: maven.apache.org/surefire/maven-surefire-plugin/…
Macarse
1
@Macarse forkModeустарел, но я думаю, что его нужно заменить только тем, forkCountкоторый имеет аналогичные функции. Один из способов использования MAVEN_OPTS - <argLine>${env.MAVEN_OPTS}</argLine>это, по-видимому, не рекомендуется, поскольку он может варьироваться от компьютера к компьютеру ( stackoverflow.com/a/10463133/32453 ). Также обратите внимание, что если вы используете jacoco, вы должны установить argLine другим способом stackoverflow.com/questions/12269558/maven-jacoco-plugin-error
rogerdpack
63

Для тех, кто плохо знаком с Maven (например, я), вот вся конфигурация, которая находится в разделе сборки вашего файла pom. Приветствия.

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.19</version>
        <configuration>
            <argLine>-Xmx1024m</argLine>
        </configuration>
      </plugin>
    </plugins>
  </build>
user738048
источник
12

Скорее всего, проблема в одном из модульных тестов, которые вы просили запустить Maven.

Таким образом, изменение размера кучи - неправильный подход. Вместо этого вы должны посмотреть на модульный тест, который вызвал OOME, и попытаться выяснить, является ли это ошибкой модульного теста или кода, который он тестирует.

Начните с просмотра трассировки стека. Если его нет, запустите mvn ... testснова с -eопцией.

Стивен С
источник
@ Стивен, я могу пройти тестовый пример в eclipse после того, как я установил-Xmx1024m в конфигурации запуска, но он всегда выдает OutOfMemoryError, когда я запускаю "mvn test" в консоли, даже когда я добавляю -e options "mvn test -DMAVEN_OPTS = -Xmx1024m "
zjffdu 01
2
@zjffdu - Вы полностью упустили мою точку зрения! Цель добавления «-e» не в том, чтобы заставить тесты работать. Это выяснить, почему они не работают.
Stephen C
1
@zjffdu - в этом случае вам нужно отладить это жестким способом, как и другие проблемы Java.
Stephen C
2
У меня возникает эта проблема при запуске тестовых примеров GWT, которые имитируют полную среду браузера. Иногда можно увеличить размер кучи.
djjeck 04
1
@djjeck - Да, иногда. Но в большинстве случаев я не думаю, что это правильное решение.
Stephen C
8

Чтобы временно обойти эту проблему, я обнаружил, что это самый быстрый способ:

export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"
Макс Хохенеггер
источник
6

Я решил эту проблему со своей стороны двумя способами:

  1. Добавление этой конфигурации в pom.xml

    <configuration><argLine>-Xmx1024m</argLine></configuration>
  2. Перейти на используемый JDK 1.7 вместо 1.6

Минь Данг
источник
2

Чтобы разрешить java.lang.OutOfMemoryError: пространство кучи Java в Maven, попробуйте настроить конфигурацию ниже в pom

<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>
Нараян Еррабачу
источник
1
+1 за упоминание MaxPermSize. Если ваша ошибка нехватки памяти вызвана загрузкой миллиарда классов, таких как создание нового HiveContext в вашем модульном тесте, это ваше решение.
swdev
-2

Не только куча памяти. также увеличьте размер perm, чтобы разрешить это исключение в maven, используйте эти переменные в переменной среды.

variable name: MAVEN_OPTS
variable value: -Xmx512m -XX:MaxPermSize=256m

Пример :

export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=500m"
e2rabi
источник
Тогда ошибка будет не «Пространство кучи Java», а другая.
Карл Рихтер