java.lang.OutOfMemoryError: ruang heap Java di Maven

123

Ketika saya menjalankan tes maven, java.lang.OutOfMemoryError terjadi. Saya mencarinya di Google untuk mencari solusi dan telah mencobanya export MAVEN_OPTS=-Xmx1024m, tetapi tidak berhasil. Ada yang tahu solusi lain untuk masalah ini, BTW Saya menggunakan maven 3.0

Terima kasih sebelumnya

Tempel pesan kesalahan di sini saat menjalankan "mvn test -e"

Tes yang gagal:
  peringatan (junit.framework.TestSuite $ 1)
  testDefaultPigJob_1 (com.snda.dw.pig.impl.DefaultPigJobLocalTest)
  testDefaultPigJob_2 (com.snda.dw.pig.impl.DefaultPigJobLocalTest)

Pengujian yang dijalankan: 11, Kegagalan: 3, Kesalahan: 0, Dilewati: 0

10/11/01 13:37:18 INFO executionengine.HExecutionEngine: Menghubungkan ke hadoop fi
le sistem di: file: ///
[INFO] ----------------------------------------------- -------------------------
[INFO] BUILD FAILURE
[INFO] ----------------------------------------------- -------------------------
[INFO] Total waktu: 30.063s
[INFO] Selesai pada: Sen 01 Nov 13:37:18 PDT 2010
[INFO] Memori Akhir: 3M / 6M
[INFO] ----------------------------------------------- -------------------------
[ERROR] Gagal menjalankan tujuan org.apache.maven.plugins: maven-surefire-plugin: 2.
5: test (default-test) pada proyek dw.pig: Ada kegagalan pengujian.
[KESALAHAN]
[ERROR] Silakan merujuk ke E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports fo
r hasil tes individu.
[ERROR] -> [Bantuan 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Gagal menjalankan tujuan o
rg.apache.maven.plugins: maven-surefire-plugin: 2.5: test (default-test) pada proyek
 dw.pig: Ada kegagalan pengujian.

Silakan merujuk ke E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-laporan untuk di
hasil tes bagi hasil.
        di org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 199)
        di org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 148)
        di org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 140)
        di org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct (LifecycleModuleBuilder.java:84)
        di org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct (LifecycleModuleBuilder.java:59)
        di org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBu
ild (LifecycleStarter.java:183)
        di org.apache.maven.lifecycle.internal.LifecycleStarter.execute (Lifecycl
eStarter.java:161)
        di org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:314)
        di org.apache.maven.DefaultMaven.execute (DefaultMaven.java:151)
        di org.apache.maven.cli.MavenCli.execute (MavenCli.java:445)
        di org.apache.maven.cli.MavenCli.doMain (MavenCli.java:168)
        di org.apache.maven.cli.MavenCli.main (MavenCli.java:132)
        di sun.reflect.NativeMethodAccessorImpl.invoke0 (Metode Asli)
        di sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.
java: 39)
        di sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAcces
sorImpl.java:25)
        di java.lang.reflect.Method.invoke (Method.java:597)
        di org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Laun
cher.java:290)
        di org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.jav
a: 230)
        di org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (La
uncher.java:409)
        di org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:
352)
Disebabkan oleh: org.apache.maven.plugin.MojoFailureException: Ada kegagalan pengujian
.

Silakan merujuk ke E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-laporan untuk di
hasil tes bagi hasil.
        di org.apache.maven.plugin.surefire.SurefirePlugin.execute (SurefirePlugi
n.java:629)
        di org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (Default
BuildPluginManager.java:107)
        di org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 195)
        ... 19 lagi
[KESALAHAN]
[ERROR] Jalankan ulang Maven menggunakan sakelar -X untuk mengaktifkan logging debug penuh.
[KESALAHAN]
[ERROR] Untuk informasi lebih lanjut tentang kesalahan dan solusi yang mungkin, mohon perhatiannya
d artikel berikut:
[ERROR] [Bantuan 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc
zjffdu.dll
sumber
Mungkin Anda mengalami kebocoran memori saat ujian? Meskipun sampah dikumpulkan, Anda masih dapat membuat kebocoran memori di java: ibm.com/developerworks/library/j-leaks
anio

Jawaban:

158

Ketika saya menjalankan tes maven, java.lang.OutOfMemoryError terjadi. Saya google untuk solusi dan telah mencoba untuk mengekspor MAVEN_OPTS = -Xmx1024m, tetapi tidak berhasil.

Mengatur Xmxopsi menggunakan MAVEN_OPTStidak berfungsi, itu mengkonfigurasi JVM yang digunakan untuk memulai Maven. Dengan demikian, maven-surefire-plugin fork JVM baru secara default, dan Anda MAVEN_OPTStidak diteruskan.

Untuk mengkonfigurasi ukuran JVM yang digunakan oleh maven-surefire-plugin, Anda harus:

  • ubah forkModemenjadi never(yang bukan ide bagus karena Maven tidak akan terisolasi dari pengujian) ~ atau ~
  • gunakan argLineparameter (dengan cara yang benar):

Dalam kasus selanjutnya, sesuatu seperti ini:

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

Tetapi saya harus mengatakan bahwa saya cenderung setuju dengan Stephen di sini, sangat mungkin ada sesuatu yang salah dengan salah satu tes Anda dan saya tidak yakin bahwa memberikan lebih banyak memori adalah solusi yang tepat untuk "memecahkan" (menyembunyikan?) Masalah Anda.

Referensi

Pascal Thivent
sumber
1
Apakah Anda memperbarui tag <configuration> hanya dalam pom.xml induk Anda?
Kevin Meredith
3
forkModetidak lagi digunakan: maven.apache.org/surefire/maven-surefire-plugin/…
Macarse
1
@Macarse forkModesudah tidak digunakan lagi, tapi saya pikir hanya untuk diganti dengan forkCountyang memiliki fungsi serupa. Salah satu cara Anda dapat menggunakan MAVEN_OPTS adalah <argLine>${env.MAVEN_OPTS}</argLine>tetapi itu tampaknya tidak disarankan karena dapat bervariasi dari komputer ke komputer ( stackoverflow.com/a/10463133/32453 ). Perhatikan juga bahwa jika Anda menggunakan jacoco, Anda seharusnya menyetel argLine dengan cara yang berbeda stackoverflow.com/questions/12269558/maven-jacoco-plugin-error
rogerdpack
63

Bagi mereka yang baru mengenal Maven (seperti saya), inilah seluruh konfigurasi yang ada di bagian build pom Anda. Bersulang.

<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>
pengguna738048
sumber
12

Kemungkinan besar masalahnya ada di salah satu unit test yang Anda minta untuk dijalankan Maven.

Karena itu, mengutak-atik ukuran heap adalah pendekatan yang salah. Sebagai gantinya, Anda harus melihat pengujian unit yang menyebabkan OOME, dan mencoba mencari tahu apakah itu adalah kesalahan pengujian unit atau kode yang diujinya.

Mulailah dengan melihat jejak tumpukan. Jika tidak ada, jalankan mvn ... testlagi dengan -eopsi.

Stephen C
sumber
@ Stephen, saya dapat lulus uji kasus dalam gerhana setelah saya menetapkan-Xmx1024m dalam konfigurasi yang dijalankan, tetapi selalu membuang OutOfMemoryError ketika saya menjalankan "uji mvn" di konsol, bahkan ketika saya menambahkan opsi -e "uji mvn -DMAVEN_OPTS = -Xmx1024m "
zjffdu
2
@zjffdu - Anda benar-benar melewatkan maksud saya! Tujuan menambahkan "-e" bukanlah untuk membuat tes bekerja. Ini untuk mencari tahu mengapa mereka tidak berhasil.
Stephen C
1
@zjffdu - dalam hal ini, Anda harus men-debug ini dengan cara yang sulit, seperti Anda melakukan masalah Java lainnya.
Stephen C
2
Saya mendapatkan masalah ini saat menjalankan kasus uji GWT, yang mensimulasikan lingkungan browser lengkap. Terkadang tidak masalah untuk meningkatkan ukuran heap.
djjeck
1
@djjeck - Ya terkadang. Tetapi menurut saya ini bukanlah solusi yang tepat untuk sebagian besar waktu.
Stephen C
8

Untuk mengatasi masalah ini sementara, saya menemukan yang berikut ini sebagai cara tercepat:

export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"
Max Hohenegger
sumber
6

Saya telah memecahkan masalah ini di pihak saya dengan 2 cara:

  1. Menambahkan konfigurasi ini di pom.xml

    <configuration><argLine>-Xmx1024m</argLine></configuration>
  2. Beralih ke JDK 1.7 yang digunakan, bukan 1.6

Minh Dang
sumber
2

Untuk menyelesaikan java.lang.OutOfMemoryError: Java heap space di Maven, coba konfigurasikan konfigurasi di bawah ini di 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>
Narayan Yerrabachu
sumber
1
1 untuk menyebutkan MaxPermSize. Jika kesalahan kehabisan memori Anda disebabkan oleh memuat banyak sekali kelas seperti membuat HiveContext baru dalam pengujian unit Anda, ini adalah solusi Anda.
swdev
-2

Tidak hanya memori heap. juga meningkatkan ukuran perm untuk menyelesaikan pengecualian itu di maven menggunakan variabel ini dalam variabel lingkungan.

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

Contoh:

export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=500m"
e2rabi.dll
sumber
Maka kesalahannya bukanlah "Java heap space", tetapi berbeda.
Karl Richter