Na dzień dzisiejszy moja kompilacja Mavena kończy się niepowodzeniem.
[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] Brak pamięci; aby zwiększyć ilość pamięci, użyj flagi -Xmx podczas uruchamiania (java -Xmx128M ...)
Od wczoraj pomyślnie przeprowadziłem kompilację Mavena.
Na dzień dzisiejszy po prostu podskoczyłem do 3 GB . Poza tym zmieniłem tylko 2-3 drobne linie kodu, więc nie rozumiem tego błędu braku pamięci.
vagrant@dev:/vagrant/workspace$ echo $MAVEN_OPTS
-Xms1024m -Xmx3000m -Dmaven.surefire.debug=-Xmx3000m
EDYCJA: Próbowałem komentować posta, zmieniając plik pom.xml mojego uszkodzonego modułu. Ale mam ten sam błąd kompilacji Maven.
<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>
maven
out-of-memory
maven-3
pom.xml
maven-compiler-plugin
Kevin Meredith
źródło
źródło
-Xmx
.Odpowiedzi:
O jakim rodzaju module „internetowym” mówisz? Czy jest to prosta wojna i czy wojna typu opakowania?
Jeśli nie korzystasz z zestawu narzędzi internetowych Google (GWT), nie musisz go dostarczać
gwt.extraJvmArgs
Rozwidlenie procesu kompilacji może nie być najlepszym pomysłem, ponieważ rozpoczyna drugi proces, który
MAVEN_OPTS
całkowicie ignoruje , co utrudnia analizę.Więc spróbuję zwiększyć Xmx, ustawiając MAVEN_OPTS
I nie rozwidlaj kompilatora do innego procesu
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin>
Zwiększanie
-XX:MaxPermSize=512m
nie powinno być wymagane, ponieważ jeśli przyczyną problemu jest rozmiar perm, to spodziewałbym się błędujava.lang.OutOfMemoryError: PermGen space
Jeśli to nie rozwiąże problemu, możesz utworzyć zrzuty sterty do dalszej analizy, dodając
-XX:+HeapDumpOnOutOfMemoryError
. Dodatkowo możesz użyć jconsole.exe w swoim katalogu bin java, aby połączyć się z jvm podczas działania kompilacji i zobaczyć, co się dzieje w stercie jvm.Kolejny pomysł (może być głupi), który do mnie przyszedł, czy masz wystarczająco dużo pamięci RAM w swoim komputerze? Definiowanie rozmiaru pamięci jest fajne, ale jeśli twój host ma tylko 4 GB, możesz mieć problem z tym, że Java nie jest w stanie użyć zdefiniowanej pamięci, ponieważ jest już używana przez system operacyjny, Javę, MS Office ...
źródło
Odpowiadając późno, aby wspomnieć o innej opcji zamiast wspólnej
MAVEN_OPTS
zmiennej środowiskowej do przekazania do Mavena, zbuduj wymagane opcje JVM.Od Maven 3.3.1 mógłbyś mieć
.mvn
folder jako część danego projektu ijvm.config
plik jako idealne miejsce na taką opcję.Jako część oficjalnych informacji o wydaniu
Główną zaletą tego podejścia jest to, że konfiguracja jest odizolowana od danego projektu i zastosowana do całej kompilacji, a także mniej krucha niż w
MAVEN_OPTS
przypadku innych programistów pracujących nad tym samym projektem (zapominając o ustawieniu).Ponadto opcje zostaną zastosowane do wszystkich modułów w przypadku projektu wielomodułowego.
źródło
Mam ten sam problem, próbując skompilować „czystą instalację” przy użyciu Lowend 512Mb RAM VPS i dobrego procesora. Uruchom OutOfMemory i wielokrotnie zabijaj skrypt.
Używałem
export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"
i pracowałem.Nadal pojawia się inny błąd kompilacji, ponieważ po raz pierwszy potrzebuję Mavena, ale problem OutOfMemory zniknął.
źródło
Dodaj opcję
do MAVEN_OPTS
maven-compiler-plugin
opcje<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>
źródło
maven-compilier-plugin
i zwiększ-XX:MaxPermSize
,Xmx
powinno być =XX:MaxPermSize
maven-compilier-plugin
Mam ten sam problem podczas kompilacji Druid.io, zwiększenie MaxDirectMemorySize w końcu zadziałało.
źródło
Poniższa konfiguracja działa w moim przypadku
<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>
Spróbuj użyć -XX: MaxPermSize zamiast -XX: MaxPermGen
źródło
źródło
Na jakim systemie operacyjnym używasz?
Aby przypisać więcej niż 2 GB pamięci RAM, musi to być co najmniej 64-bitowy system operacyjny.
Jest też inny problem. Nawet jeśli Twój system operacyjny ma nieograniczoną pamięć RAM, ale jest ona podzielona w taki sposób, że nie jest dostępny ani jeden wolny blok 2 GB, wyjdziesz też z wyjątków pamięci. Pamiętaj, że normalna pamięć Heap jest tylko częścią pamięci używanej przez proces VM. Więc na 32-bitowej maszynie prawdopodobnie nigdy nie będziesz w stanie ustawić Xmx na 2048MB.
Sugerowałbym również ustawienie min maksymalnej pamięci na tę samą wartość, ponieważ w tym przypadku, gdy tylko maszyn wirtualnej zabraknie pamięci, pierwszy czas 1 GB zostanie przydzielony od początku, wówczas maszyna wirtualna przydziela nowy blok (zakładając, że zwiększa się on z 500 MB bloków) o wielkości 1,5 GB po przydzieleniu, skopiowałoby całą zawartość z pierwszego bloku do nowego i zwolniła pamięć. Jeśli ponownie zabraknie pamięci, 2 GB są przydzielane, a 1,5 GB jest następnie kopiowane, tymczasowo przydzielając 3,5 GB pamięci.
źródło
Budując projekt na platformie Unix / Linux, ustaw składnię opcji Maven jak poniżej. Zwróć uwagę na pojedyncze znaki qoutation, a nie podwójne qoutation.
źródło
Używanie .mvn / jvm.config działało dla mnie, a ponadto ma dodatkową zaletę w postaci połączenia z projektem.
źródło
Dzieje się tak w dużych projektach w systemie Windows, gdy używany jest cygwin lub inny emulator systemu Linux (git bash). Przez przypadek oba nie działają w moim projekcie, który jest dużym projektem open source. W skrypcie sh jest wywoływanych kilka poleceń mvn. Rozmiar pamięci rośnie do rozmiaru stosu większego niż określony w Xmx i przez większość czasu w przypadku uruchamiania drugiego procesu systemu Windows. To sprawia, że zużycie pamięci jest jeszcze większe.
Rozwiązaniem w tym przypadku jest użycie pliku wsadowego i zmniejszonego rozmiaru Xmx, a następnie operacje Maven zakończą się pomyślnie. Jeśli jest zainteresowanie, mogę ujawnić więcej szczegółów.
źródło
Ktoś już wspomniał o problemie z 32-bitowym systemem operacyjnym. W moim przypadku problem polegał na tym, że kompilowałem z 32-bitowym JDK.
źródło
Zwiększenie rozmiaru pamięci w zmiennej środowiskowej „MAVEN_OPTS” pomoże rozwiązać ten problem. U mnie zadziałało zwiększenie z -Xmx756M do -Xmx1024M.
źródło