Menyetel ruang heap Java di bawah Maven 2 di Windows

91

Saya mendapatkan pesan ini selama membangun proyek saya

java.lang.OutOfMemoryError: ruang heap Java

Bagaimana cara menambah ruang heap, saya punya 8Gb atau RAM, tidak mungkin maven menghabiskan banyak, saya menemukan http://vikashazrati.wordpress.com/2007/07/26/quicktip-how-to-increase-the -java-heap-memory-for-maven-2-on-linux / bagaimana melakukannya di linux, tapi saya menggunakan windows 7. Bagaimana cara mengubah java heap space di bawah windows?

Gandalf StormCrow
sumber
Saya berasumsi Anda menggunakan windows versi 64bit? Jika tidak, Anda tidak akan menentukan lebih dari 1.5G sebagai ukuran heap, jendela 0.5G lainnya yang memungkinkan Anda untuk menggunakan secara langsung akan dibutuhkan oleh JVM. Ada opsi untuk membuat windows hanya menggunakan 1G untuk kode mode kernal dan 3G untuk kode mode pengguna, tetapi sun JVM tidak mengizinkan Anda untuk menggunakannya.
vickirk
@vickirk Saya menggunakan windows versi 64-bit
Gandalf StormCrow
1
Apakah Anda juga menggunakan JVM versi 64-bit? Ini akan terdaftar sebagai Windows x64 dalam daftar dropdown di halaman download JDK: java.sun.com/javase/downloads/widget/jdk6.jsp
Powerlord

Jawaban:

117

Variabel lingkungan yang akan disetel MAVEN_OPTS, misalnya MAVEN_OPTS=-Xmx1024m. The maxmemkonfigurasi di pom hanya berlaku ketika Anda mengatur plugin compiler untuk garpu javacke dalam JVM baru. Jika tidak, plugin berjalan di dalam VM yang sama dengan Maven dan dengan demikian di dalam memori yang diteruskan pada baris perintah melalui MAVEN_OPTS.

Untuk menyetel MAVEN_OPTS di bawah Windows 7:

  1. Klik kanan pada My Computer dan pilih Properties (pintasan keyboard tekan Windows+ Pause/Break)
  2. Klik tautan Pengaturan Sistem Lanjutan yang terletak di navigasi kiri Properti Sistem untuk menampilkan Properti Sistem Lanjutan
  3. Pergi ke Lanjutan tab dan klik pada Variabel Lingkungan tombol yang terletak di bagian bawah dari Advanced System Properti jendela konfigurasi
  4. Buat variabel pengguna baru , setel nama Variabel ke MAVEN_OPTS dan setel nilai Variabel ke -Xmx1024m(atau lebih)

Buka jendela perintah baru dan jalankan mvn.

Pascal Thivent
sumber
1
Apakah ini berdampak pada kecepatan bangunan saya? Apakah ada tip untuk meningkatkan maven build saya dengan mengalokasikan lebih banyak memori untuk itu?
Mahendran
45

Jika Anda kehabisan ruang heap selama pengujian JUnit yang pasti (atau gagal), mengubah MAVEN_OPTS mungkin tidak membantu Anda. Saya terus mencoba konfigurasi yang berbeda di MAVEN_OPTS tanpa hasil sampai saya menemukan posting ini yang memperbaiki masalah.

Pada dasarnya JUnits bercabang ke lingkungan mereka sendiri dan mengabaikan pengaturan di MAVEN_OPTS. Anda perlu mengkonfigurasi jitu di pom Anda untuk menambahkan lebih banyak memori untuk JUnits.

Semoga ini bisa menghemat waktu orang lain!


Sunting: Menyalin solusi dari blog Keith Chapman untuk berjaga-jaga jika suatu saat tautan rusak:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <forkMode>pertest</forkMode> 
    <argLine>-Xms256m -Xmx512m</argLine>
    <testFailureIgnore>false</testFailureIgnore> 
    <skip>false</skip> 
    <includes> 
      <include>**/*IntegrationTestSuite.java</include>
    </includes>
  </configuration>
</plugin>

Pembaruan (5/31/2017): Terima kasih kepada @johnstosh karena telah menunjukkan hal ini - pasti telah sedikit berkembang sejak saya meletakkan jawaban ini di luar sana. Berikut ini tautan ke dokumentasi mereka dan contoh kode yang diperbarui (baris arg masih merupakan bagian penting untuk pertanyaan ini):

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20</version>
    <configuration>
        <forkCount>3</forkCount>
        <reuseForks>true</reuseForks>
        <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
        <systemPropertyVariables>
            <databaseSchema>MY_TEST_SCHEMA_${surefire.forkNumber}</databaseSchema>
        </systemPropertyVariables>
        <workingDirectory>FORK_DIRECTORY_${surefire.forkNumber}</workingDirectory>
    </configuration>
  </plugin>
Marquee
sumber
Itu menghemat sebagian waktu saya! Terima kasih! Sayangnya saya hanya dapat memberi suara positif sekali! :)
javanna
Ini adalah jawaban yang paling membantu di antara yang lain, dalam gaya pakar sejati. Terima kasih!
Andremoniy
Ini adalah jawaban sebenarnya untuk pertanyaan
Jonathan Landrum
1
Lihat dokumentasinya pasti. versi pasti sebelum 2.14 menggunakan parameter forkMode untuk mengkonfigurasi forking. Meskipun parameter tersebut masih didukung untuk kompatibilitas ke belakang, pengguna sangat dianjurkan untuk memigrasi konfigurasi mereka dan menggunakan forkCount dan reuseForks sebagai gantinya.
johnstosh
21

Ini harus menjadi perintah yang sama, kecuali SET, bukan EKSPOR

  • set MAVEN_OPTS = -Xmx512m akan memberikan tumpukan 512Mb
  • set MAVEN_OPTS = -Xmx2048m akan memberikannya 2Gb dari tumpukan
corsiKa
sumber
Saya setuju bahwa itu harus menjadi perintah yang sama, tetapi itu tidak membuatnya menjadi pernyataan yang benar, inilah alasannyaC:\my_project>MAVEN_OPTS=-Xmx512m 'MAVEN_OPTS' is not recognized as an internal or external command, operable program or batch file.
Gandalf StormCrow
glowcoder sedikit salah. Anda tidak perlu MENGEKSPOR variabel, tetapi untuk memberikan nilai, Anda perlu mengaturnya.
JeremyP
Anda juga dapat menyetel MAVEN_OPTS sebagai variabel lingkungan windows jika Anda ingin menggunakan nilai yang sama untuk setiap build.
digitaljoel
@Gandalf Anda harus meletakkan set di depannya @Jeremy ya, itulah mengapa dikatakan untuk menggunakan set daripada ekspor
corsiKa
9

Di Mac: Alih-alih JAVA_OPTSdan MAVEN_OPTS, gunakan _JAVA_OPTIONS sebagai gantinya. Ini bekerja!

Steve
sumber
ini juga berfungsi di windows. Tambahkan ini sebagai variabel lingkungan dalam konfigurasi jalankan maven di gerhana, pengujian yang dijalankan dari m2e tidak lagi memberikan kesalahan PermGen
fedeb
3

Setelah mencoba menggunakan variabel MAVEN_OPTS tanpa hasil, saya menemukan situs ini yang berhasil untuk saya. Jadi yang harus saya lakukan adalah menambahkan -Xms128m -Xmx1024m ke opsi VM default dan itu berhasil.

Untuk mengubahnya di Eclipse, buka Window -> Preferences -> Java -> Installed JRE. Pilih JRE / JDK yang telah dicentang dan klik edit.

kent_e
sumber
0

Di windows:

Tambahkan variabel lingkungan (di kedua variabel sistem dan pengguna, saya punya masalah aneh, yang mendapat var dari berbagai tempat, jadi saya menambahkannya di keduanya).

Beri nama MAVEN_OPTS.

Nilainya akan menjadi: -Xms1024m -Xmx3000m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled

Jumlahnya bisa berbeda, buatlah sesuai dengan ukuran anggota Anda.

Saya punya masalah itu dan ini memperbaikinya, tidak ada yang lain!

Hrabia
sumber
0

Berhasil - Untuk mengubah di Eclipse, buka Window -> Preferensi -> Java -> JRE Terpasang. Pilih JRE / JDK yang telah dicentang dan klik edit.

Argumen VM Default = -Xms128m -Xmx1024m

Anadi Kumar
sumber
-7

Anda mencari 2 opsi untuk java:

  • -Xmx ukuran heap maksimum
  • -Xms memulai ukuran tumpukan

Tempatkan mereka dalam permintaan baris perintah Anda dari yang javadapat dieksekusi, seperti ini:

java -Xms512M -Xmx1024M my.package.MainClass

Perlu diingat bahwa Anda mungkin ingin ukuran awal dan maksimum heap sama, bergantung pada aplikasinya, karena ini menghindari pengubahan ukuran heap selama runtime (yang dapat memakan waktu dalam aplikasi yang perlu responsif). Mengubah ukuran tumpukan dapat memerlukan banyak pemindahan objek dan mengulangi pembukuan.

Untuk proyek sehari-hari, buatlah apa pun yang menurut Anda cukup baik. Profil untuk bantuan.

Phil
sumber
1
seperti yang dinyatakan ebelisle, opsi ini tidak akan berfungsi sama sekali karena Anda, menggunakan Maven, harus menentukan setidaknya itu adalah opsi Maven dengan "-D" tetapi masih bukan perintah java yang sedang kita bicarakan
frandevel