Maven Yetersiz Bellek Oluşturma Hatası


90

Bugün itibariyle maven derlemem başarısız oluyor.

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

[HATA] Bellek yetersiz; bellek miktarını artırmak için başlangıçta -Xmx bayrağını kullanın (java -Xmx128M ...)

Dün itibariyle başarılı bir şekilde bir maven derlemesi çalıştırdım.

Bugün itibariyle, yığınımı 3 GB'a çıkardım . Ayrıca, sadece 2-3 küçük kod satırını değiştirdim, bu yüzden bu 'bellek yetersiz' hatasını anlamıyorum.

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

DÜZENLEME: Başarısız modülümün pom.xml'sini değiştirerek göndericinin yorumunu denedim. Ama aynı maven derleme hatası aldım.

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

1
Stacktrace'den daha fazlasını sağlayabilir misiniz? Bir String başlatmanın belleğin tükenmesine neyin sebep olabileceğini merak ediyorum. Yığın boyutunu MAVEN_OPTS'ta ayarlamak, gidilecek yol gibi geliyor, ancak benim tahminim, bir yerlerde, yeterince ayırmadığınız gülünç derecede büyük bir String'in olduğu -Xmx.
Edward Samson

Yanıtlar:


139

Ne tür bir 'web' modülünden bahsediyorsunuz? Basit bir savaş mı ve ambalaj türü savaş mı var?

Google'ın web araç setini (GWT) kullanmıyorsanız, herhangi bir gwt.extraJvmArgs

Derleme sürecini çatallamak en iyi fikir olmayabilir, çünkü MAVEN_OPTStamamen görmezden gelen ikinci bir süreci başlatır ve böylece analizi daha zor hale getirir.

Bu yüzden MAVEN_OPTS ayarlayarak Xmx'i artırmaya çalışırdım.

export MAVEN_OPTS="-Xmx3000m"

Ve derleyiciyi farklı bir sürece bağlamayın

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

Artırma -XX:MaxPermSize=512mgerekli olmamalıdır çünkü sorunun nedeni perm boyutu ise, o zaman hatayı beklerimjava.lang.OutOfMemoryError: PermGen space

Bu, sorununuzu çözmezse, ekleyerek daha fazla analiz için yığın dökümleri oluşturabilirsiniz -XX:+HeapDumpOnOutOfMemoryError. Ek olarak, derleme çalışırken jvm'ye bağlanmak ve jvm yığınının içinde neler olup bittiğini görmek için java bin dizininizdeki jconsole.exe'yi kullanabilirsiniz.

Aklıma gelen başka bir fikir (belki aptalca olabilir), makinenizin içinde yeterince RAM var mı? Bellek boyutunu tanımlamak güzel, ancak ana makinenizde yalnızca 4 GB varsa ve o zaman Java'nın tanımlanmış Belleği kullanamaması sorunuyla karşılaşabilirsiniz, çünkü zaten işletim sistemi, Java, MS-Office ...


cevabın için teşekkürler. Çatallı JVM'yi kaldırma öneriniz 'maven-surefire-eklentisi' için de geçerli mi? MAVEN_OPTS belleğimi 3000'e yükseltmek için önerinizi denedim. Maven derleyicim çatallı bir JVM için bir ayara sahip değildi, bu yüzden orada hiçbir şeyi değiştirmem gerekmedi. Ve evet, Konuk VM'mde 4 GB RAM var. Ana makinede 8 GB RAM vardır.
Kevin Meredith

2
bu arada, mvn derlemesi önerilerinizle tekrar başarısız oldu.
Kevin Meredith

1
Genellikle, çalıştırmadığım sürece süreç çatallamasından kaçınmaya çalışırım. Sisteminizde yalnızca 4 GB varsa, işletim sistemi tarafından ~ 1 GB kullanılır. Yani 3GB dinlenmeniz var. Maven, Xms = 1GB ile başlıyorsa, kalan boş Bellek 2GB'dir. Daha sonra, derleyici çatalı, boş belleği 1GB'ye düşüren Xms = 1GB .... ile başladı. Artık, çatallı hata korumalı eklenti işlemi olan PermGen Belleği 128MB'yi çıkartabilirsiniz ... Gördüğünüz gibi, Xmx ayarınız büyük olasılıkla JVM olarak kullanılamayacak çünkü bellek basit değil serbesttir. JConsole kullanmayı denediniz mi? ve HeapDumpOnOutOfMemoryError?
vach

Xms1024m'yi MAVEN_OPTS cihazımdan kaldırdım, ancak mvn yapısı hala başarısız oldu. MAVEN_OPTS'uma "HeapDump ..." ekledim, ancak dökümün nerede yazdırılacağından emin değilim. Şimdi JConsole'a bakıyorum.
Kevin Meredith

Dökümler jvms dizininde yer alır
vach

37

Maven'e MAVEN_OPTSgeçmek için ortak ortam değişkeninden başka bir seçenekten bahsetmek için geç yanıt vermek , gerekli JVM seçeneklerini oluşturun.

Maven 3.3.1'den bu yana .mvn, ilgili projenin bir parçası olarak bir klasöre ve jvm.configböyle bir seçenek için mükemmel bir yer olarak bir dosyaya sahip olabilirsiniz.

iki yeni isteğe bağlı yapılandırma dosyası .mvn/jvm.configve .mvn/maven.configproje kaynak ağacının temel dizininde bulunur. Varsa, bu dosyalar varsayılan jvm ve maven seçeneklerini sağlayacaktır. Bu dosyalar proje kaynak ağacının bir parçası olduğundan, tüm proje kontrollerinde bulunacaklar ve proje her oluşturulduğunda otomatik olarak kullanılacaklar.

Resmi sürüm notlarının bir parçası olarak

Maven'de JVM konfigürasyonunu proje bazında tanımlamak kolay değildir. Bir ortam değişkenine dayalı mevcut mekanizma MAVEN_OPTSve kullanımı ${user.home}/.mavenrc, projenin parçası olmama dezavantajı ile diğer bir seçenektir.

Bu sürümden başlayarak, JVM yapılandırmasını ${maven.projectBasedir}/.mvn/jvm.configdosya yoluyla tanımlayabilirsiniz; bu, derlemeniz için her proje temelinde seçenekleri tanımlayabileceğiniz anlamına gelir. Bu dosya projenizin bir parçası olacak ve projenizle birlikte kontrol edilecektir. Yani hayır için artık ihtiyaç MAVEN_OPTS, .mavenrcdosyalar. Örneğin, aşağıdaki JVM seçeneklerini ${maven.projectBasedir}/.mvn/jvm.configdosyaya koyarsanız :

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

Bu yaklaşımın ana avantajı, konfigürasyonun ilgili projeye izole edilmesi ve tüm yapıya uygulanması MAVEN_OPTSve aynı proje üzerinde çalışan diğer geliştiricilere göre daha az kırılgan olmasıdır (ayarlamayı unutarak).
Ayrıca, çoklu modül projesi olması durumunda seçenekler tüm modüllere uygulanacaktır.


2
JDK 8 kullanıyorsanız MaxPermSize'ın göz ardı edildiğini unutmayın.
GeraldScott

15

Lowend 512Mb ram VPS ve iyi CPU kullanarak "temiz kurulum" derlemeye çalışırken aynı problemi yaşadım. OutOfMemory'yi çalıştırın ve komut dosyasını tekrar tekrar öldürün.

Kullandım export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"ve çalıştım.

Hala başka bir derleme hatası alıyorum çünkü Maven'e ilk kez ihtiyacım var, ancak OutOfMemory sorunu ortadan kalktı.


11

Seçenek ekle

-XX:MaxPermSize=512m

MAVEN_OPTS'a

maven-compiler-plugin seçenekler

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

2
Aslında bu yazıyı yaptıktan sonra -XX: MaxPermSize = 1024m seçeneğini ekledim. Ama yine de yetersiz bellek hatası alıyorum. Başka bir SO gönderisi, çatallı iş parçacıkları tarafından kullanılan belleği yükseltmek için maven-surefire-eklentisinin argLine'ına bir seçenek eklemem gerektiğinden bahsetti. Bunu <argLine> -Xms256m -Xmx1024m -XX: PermSize = 128m -XX: MaxPermSize = 512m </argLine>
Kevin Meredith

Bundan bahsetmeliydim ... Hayır, maven yapısı hala başarısız oldu.
Kevin Meredith

Tüm bu özellikleri ekleyin maven-compilier-pluginve artırın -XX:MaxPermSize, Xmx=XX:MaxPermSize
Ilya

Ayrıca <fork> true </true> seçeneğini de kullanınmaven-compilier-plugin
Ilya

Bunu denedim (lütfen orijinal gönderiye bakın), ancak mvn yapım hala başarısız oldu.
Kevin Meredith

4

Druid.io'yu derlerken aynı problemi yaşadım, MaxDirectMemorySize'ı artırmak nihayet çalıştı.

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"

Meraklı, MaxDirectMemorySize varsayılan olarak görünüşte sınırsızdır (yani önceden var olan bir limiti ayarlamadan bir limit eklediniz).
Tomer Gabel

4

Bu konfigürasyon benim durumumda çalışıyor

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

-XX: MaxPermGen yerine -XX: MaxPermSize kullanmayı deneyin



3

Ne tür bir işletim sistemi kullanıyorsunuz?

2GB'den fazla ram atamak için en az 64bit işletim sistemi olması gerekir.

O zaman başka bir sorun var. İşletim sisteminizde Sınırsız RAM olsa bile, ancak bu 2 GB'lık tek bir boş blok olmayacak şekilde parçalanmış olsa bile, bellek istisnalarından da kurtulacaksınız. Ve normal Yığın belleğinin, VM işleminin kullandığı belleğin yalnızca bir parçası olduğunu unutmayın. Yani 32bit bir makinede Xmx'i asla 2048MB'ye ayarlayamayacaksınız.

Aynı değere min maks. Bellek ayarlamanızı da öneririm, çünkü bu durumda VM'nin belleği biter bitmez başlangıçtan itibaren 1GB ilk zaman ayrılır, VM daha sonra yeni bir blok tahsis eder ( 500MB'lık bloklar) 1,5GB tahsis edildikten sonra, tüm şeyleri blok 1'den yenisine kopyalar ve bundan sonra boş Hafıza. Bellek tekrar biterse, 2GB tahsis edilir ve daha sonra 1,5 GB kopyalanır ve geçici olarak 3,5GB bellek ayrılır.


2

Unix / Linux platformunda projeyi oluştururken, Maven options sözdizimini aşağıdaki gibi ayarlayın. İkili qoutation değil, tek qoutation işaretlerine dikkat edin.

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'

0

.Mvn / jvm.config kullanmak benim için işe yaradı, ayrıca projeyle bağlantılı olmanın ek yararı da var.


0

Bu, cygwin veya diğer linux emülatörü kullanıldığında (git bash) Windows'taki büyük projelerde olur. Bir tesadüf eseri, her ikisi de benim projemde çalışmıyor, bu büyük bir açık kaynak projesi. Bir sh betiğinde, birkaç mvn komutu çağrılır. Bellek boyutu Xmx'te belirtilenden daha büyük yığın boyutuna büyür ve çoğu zaman ikinci pencere işlemi başlatılır. Bu, bellek tüketimini daha da artırıyor.

Bu durumda çözüm, toplu iş dosyası ve azaltılmış Xmx boyutunu kullanmaktır ve ardından maven işlemleri başarılı olur. İlgi varsa daha fazla ayrıntı verebilirim.


0

Birisi 32 bit işletim sistemindeki sorundan bahsetti. Benim durumumda sorun 32 bit JDK ile derlememdi.


0

'MAVEN_OPTS' ortam değişkenindeki bellek boyutunu artırmak, bu sorunun çözülmesine yardımcı olacaktır. Benim için -Xmx756M'den -Xmx1024M'ye yükseltmek işe yaradı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.