Maven Keluar dari Kegagalan Membangun Memori

90

Sampai hari ini, kompilasi maven saya gagal.

[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] Kehabisan memori; untuk menambah jumlah memori, gunakan -Xmx flag saat startup (java -Xmx128M ...)

Sampai kemarin saya telah berhasil menjalankan kompilasi maven.

Pada hari ini, saya baru saja menaikkan heap saya menjadi 3 GB . Juga, saya hanya mengubah 2-3 baris kode kecil, jadi saya tidak mengerti kesalahan 'kehabisan memori' ini.

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

EDIT: Saya mencoba komentar poster dengan mengubah pom.xml modul saya yang gagal. Tapi saya mendapat kesalahan build maven yang sama.

    <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>
Kevin Meredith
sumber
1
Bisakah Anda memberikan lebih banyak stacktrace? Saya penasaran untuk melihat apa yang mungkin menyebabkan inisialisasi String kehabisan memori. Menyetel ukuran tumpukan di MAVEN_OPTS kedengarannya seperti cara yang harus dilakukan, tetapi tebakan saya adalah bahwa di suatu tempat ada String yang sangat besar yang mungkin tidak cukup Anda alokasikan -Xmx.
Edward Samson

Jawaban:

139

Modul 'web' seperti apa yang Anda bicarakan? Apakah ini perang sederhana dan perang tipe kemasan?

Jika Anda tidak menggunakan perangkat web Google (GWT), Anda tidak perlu menyediakannya gwt.extraJvmArgs

Proses kompilasi mungkin bukan ide terbaik, karena proses ini memulai proses kedua yang mengabaikan MAVEN_OPTSsama sekali, sehingga membuat analisis menjadi lebih sulit.

Jadi saya akan mencoba untuk meningkatkan Xmx dengan mengatur MAVEN_OPTS

export MAVEN_OPTS="-Xmx3000m"

Dan jangan membagi kompiler ke proses yang berbeda

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

Meningkatkan -XX:MaxPermSize=512mtidak diperlukan karena jika ukuran perm adalah alasan masalahnya, maka saya mengharapkan kesalahanjava.lang.OutOfMemoryError: PermGen space

Jika itu tidak menyelesaikan masalah Anda, maka Anda dapat membuat heap dump untuk analisis lebih lanjut dengan menambahkan -XX:+HeapDumpOnOutOfMemoryError. Selain itu, Anda dapat menggunakan jconsole.exe di direktori java bin Anda untuk menyambung ke jvm saat kompilasi berjalan dan melihat apa yang terjadi di dalam heap jvm.

Ide lain (mungkin yang bodoh) yang muncul di benak saya, apakah Anda memiliki cukup RAM di dalam mesin Anda? Mendefinisikan ukuran memori itu bagus, tetapi jika host Anda hanya memiliki 4GB dan Anda mungkin memiliki masalah bahwa Java tidak dapat menggunakan Memori yang ditentukan karena sudah digunakan oleh OS, Java, MS-Office ...

vach
sumber
terima kasih untuk balasan Anda. Apakah saran Anda untuk menghapus JVM bercabang juga berlaku untuk 'maven-surefire-plugin?' Saya mencoba saran Anda untuk menaikkan memori MAVEN_OPTS saya menjadi 3000. Kompilator maven saya tidak memiliki pengaturan untuk JVM bercabang, jadi saya tidak perlu mengubah apa pun di sana. Dan ya, VM Tamu saya memiliki RAM 4 GB. Mesin host memiliki RAM 8 GB.
Kevin Meredith
2
Omong-omong, mvn build gagal lagi dengan saran Anda.
Kevin Meredith
1
Biasanya saya mencoba menghindari proses forking selama saya tidak menjalankannya. Jika sistem Anda hanya memiliki 4GB maka ~ 1 GB digunakan oleh OS. Jadi Anda punya istirahat 3GB. Jika maven dimulai dengan Xms = 1GB maka sisa Memori kosong adalah 2GB. Selanjutnya, garpu kompiler dimulai dengan Xms = 1GB .... yang mengurangi memori bebas menjadi 1GB. Sekarang Anda dapat mengurangi PermGen Memory 128MB, proses plugin-pengaman-gagal bercabang, ... Seperti yang Anda lihat, pengaturan Xmx Anda kemungkinan besar tidak akan pernah dapat digunakan sebagai JVM karena memorinya sederhana bukan gratis. Sudahkah Anda mencoba menggunakan JConsole? dan HeapDumpOnOutOfMemoryError?
vach
Saya menghapus Xms1024m dari MAVEN_OPTS saya, namun mvn build masih gagal. Saya menambahkan "HeapDump ..." ke MAVEN_OPTS saya, tetapi saya tidak yakin di mana dump akan dicetak. Melihat ke JConsole sekarang.
Kevin Meredith
Dumps ditempatkan di direktori
jvms
37

Menjawab terlambat untuk menyebutkan opsi lain daripada MAVEN_OPTSvariabel lingkungan umum untuk diteruskan ke Maven membangun opsi JVM yang diperlukan.

Sejak Maven 3.3.1 , Anda dapat memiliki .mvnfolder sebagai bagian dari proyek terkait dan jvm.configfile sebagai tempat yang tepat untuk opsi semacam itu.

dua file konfigurasi opsional baru .mvn/jvm.configdan .mvn/maven.config, terletak di direktori dasar pohon sumber proyek. Jika ada, file ini akan menyediakan opsi jvm dan maven default. Karena file-file ini adalah bagian dari pohon sumber proyek, file-file ini akan ada di semua pembayaran proyek dan akan digunakan secara otomatis setiap kali proyek dibangun.

Sebagai bagian dari catatan rilis resmi

Di Maven, tidak mudah untuk menentukan konfigurasi JVM pada basis per proyek. Mekanisme yang ada berdasarkan variabel lingkungan MAVEN_OPTSdan penggunaan ${user.home}/.mavenrcadalah opsi lain dengan kekurangan tidak menjadi bagian dari proyek.

Dimulai dengan rilis ini, Anda dapat menentukan konfigurasi JVM melalui ${maven.projectBasedir}/.mvn/jvm.configfile yang berarti Anda dapat menentukan opsi untuk build Anda pada basis per project. File ini akan menjadi bagian dari proyek Anda dan akan diperiksa bersama dengan proyek Anda. Jadi tidak ada perlu lagi untuk MAVEN_OPTS, .mavenrcfile. Jadi misalnya jika Anda memasukkan opsi JVM berikut ke dalam ${maven.projectBasedir}/.mvn/jvm.configfile:

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

Keuntungan utama dari pendekatan ini adalah bahwa konfigurasi diisolasi ke proyek yang bersangkutan dan diterapkan ke seluruh build juga, dan kurang rapuh dibandingkan MAVEN_OPTSdeveloper lain yang mengerjakan proyek yang sama (lupa menyetelnya).
Selain itu, opsi akan diterapkan ke semua modul dalam kasus proyek multi-modul.

A_Di-Matteo
sumber
2
Perhatikan bahwa MaxPermSize diabaikan jika Anda menggunakan JDK 8.
GeraldScott
15

Saya mendapat masalah yang sama saat mencoba mengkompilasi "instalasi bersih" menggunakan VPS ram 512Mb Lowend dan CPU yang bagus. Jalankan OutOfMemory dan matikan skrip berulang kali.

Saya menggunakan export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"dan bekerja.

Masih mendapatkan beberapa kegagalan kompilasi karena baru pertama kali saya membutuhkan Maven, tetapi masalah OutOfMemory telah hilang.

m3nda
sumber
11

Tambahkan opsi

-XX:MaxPermSize=512m

ke MAVEN_OPTS

maven-compiler-plugin pilihan

  <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>
Ilya
sumber
2
Saya sebenarnya menambahkan opsi, -XX: MaxPermSize = 1024m, setelah membuat posting ini. Tapi saya masih mendapat kesalahan memori. Posting SO lain menyebutkan bahwa saya perlu menambahkan opsi ke argLine maven-surefire-plugin untuk menaikkan memori yang digunakan oleh utas bercabang. Saya meningkatkannya menjadi <argLine> -Xms256m -Xmx1024m -XX: PermSize = 128m -XX: MaxPermSize = 512m </argLine>
Kevin Meredith
Seharusnya aku menyebutkan bahwa ... Tidak, build maven masih gagal.
Kevin Meredith
Tambahkan semua properti ini ke maven-compilier-plugindan tingkatkan -XX:MaxPermSize, Xmxseharusnya =XX:MaxPermSize
Ilya
Juga gunakan opsi <fork> true </true> dimaven-compilier-plugin
Ilya
Saya mencobanya (lihat posting asli), tetapi mvn build saya masih gagal.
Kevin Meredith
4

Saya mendapat masalah yang sama saat mengkompilasi Druid.io, meningkatkan MaxDirectMemorySize akhirnya berhasil.

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
hahakubile
sumber
Penasaran, MaxDirectMemorySize seolah-olah tidak dibatasi secara default (yaitu Anda menambahkan batas, tidak menyesuaikan yang sudah ada sebelumnya).
Tomer Gabel
4

Konfigurasi di bawah ini berfungsi dalam kasus saya

<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>

Coba gunakan -XX: MaxPermSize daripada -XX: MaxPermGen

Narayan Yerrabachu
sumber
4
_JAVA_OPTIONS="-Xmx3G" mvn clean install
Pengaturan perangkat
sumber
3

Jenis OS apa yang Anda jalankan?

Untuk menetapkan lebih dari 2GB ram itu harus setidaknya OS 64bit.

Lalu ada masalah lain. Sekalipun OS Anda memiliki RAM Tidak Terbatas, tetapi itu terfragmentasi sedemikian rupa sehingga tidak ada satu pun blok gratis 2GB yang tersedia, Anda juga akan keluar dari pengecualian memori. Dan perlu diingat bahwa memori Heap normal hanyalah sebagian dari memori yang digunakan proses VM. Jadi pada mesin 32bit Anda mungkin tidak akan pernah bisa mengatur Xmx ke 2048MB.

Saya juga menyarankan untuk mengatur min memori maks ke nilai yang sama, karena dalam hal ini segera setelah VM kehabisan memori, waktu pertama 1GB dialokasikan dari awal, VM kemudian mengalokasikan blok baru (dengan asumsi itu meningkat dengan 500MB blok) 1,5GB setelah itu dialokasikan, itu akan menyalin semua barang dari blok satu ke yang baru dan membebaskan Memori setelah itu. Jika kehabisan Memori lagi, 2GB dialokasikan dan 1,5 GB kemudian disalin, untuk sementara mengalokasikan memori 3,5GB.

Christofer Dutz
sumber
2

Saat membangun proyek pada platform Unix / Linux, atur sintaks opsi Maven seperti di bawah ini. Perhatikan bahwa tanda qoutation tunggal, bukan qoutation ganda.

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
ÖMER TAŞCI
sumber
0

Menggunakan .mvn / jvm.config bekerja untuk saya plus memiliki manfaat tambahan karena ditautkan dengan proyek.

colinbes
sumber
0

Ini terjadi dalam proyek besar di Windows ketika cygwin atau emulator linux lainnya digunakan (git bash). Secara kebetulan, keduanya tidak berfungsi pada proyek saya, apa itu proyek open source yang besar. Dalam skrip sh, beberapa perintah mvn dipanggil. Ukuran memori tumbuh ke ukuran tumpukan lebih besar yang ditentukan dalam Xmx dan sebagian besar waktu dalam kasus proses jendela kedua dimulai. Ini membuat konsumsi memori menjadi lebih tinggi.

Solusi dalam kasus ini adalah dengan menggunakan file batch dan ukuran Xmx yang diperkecil, kemudian operasi maven berhasil. Jika ada minat saya dapat mengungkapkan lebih detail.

zhrist
sumber
0

Seseorang telah menyebutkan masalah dengan OS 32 bit. Dalam kasus saya, masalahnya adalah saya mengompilasi dengan 32 bit JDK.

pengguna2046211
sumber
0

Meningkatkan ukuran memori dalam variabel lingkungan 'MAVEN_OPTS' akan membantu menyelesaikan masalah ini. Bagi saya, meningkatkan dari -Xmx756M menjadi -Xmx1024M berhasil.

Nidhi
sumber