Ustawianie miejsca na sterty Java pod Maven 2 w systemie Windows

91

Otrzymuję tę wiadomość podczas kompilacji mojego projektu

java.lang.OutOfMemoryError: Miejsce na sterty Java

Jak zwiększyć miejsce na stercie, mam 8 Gb lub RAM, to niemożliwe, żeby maven zużywał tak dużo, znalazłem to http://vikashazrati.wordpress.com/2007/07/26/quicktip-how-to-increase-the -java-heap-memory-for-maven-2-on-linux / jak to zrobić na Linuksie, ale pracuję na Windows 7. Jak mogę zmienić miejsce na stosie java pod oknami?

Gandalf StormCrow
źródło
Zakładam, że używasz 64-bitowej wersji systemu Windows? Jeśli nie, nie zamierzasz określać więcej niż 1,5 G jako rozmiaru sterty, pozostałe okna 0,5 G, które umożliwiają bezpośrednie użycie, będą wymagane przez JVM. Istnieje opcja, aby Windows używał tylko 1G dla kodu trybu jądra i 3G dla kodu trybu użytkownika, ale Sun JVM nie pozwoli ci go używać.
vickirk
@vickirk Jestem na 64-bitowej wersji systemu Windows
Gandalf StormCrow
1
Czy używasz również 64-bitowej wersji maszyny JVM? Zostanie wymieniony jako Windows x64 na liście rozwijanej na stronie pobierania JDK: java.sun.com/javase/downloads/widget/jdk6.jsp
Powerlord

Odpowiedzi:

117

Zmienna środowiskowa do zestawu jest MAVEN_OPTS, na przykład MAVEN_OPTS=-Xmx1024m. maxmemKonfiguracja w pom Dotyczy tylko po ustawieniu plugin kompilator widelec javacdo nowej JVM. W przeciwnym razie wtyczka działa na tej samej maszynie wirtualnej co Maven, a zatem w pamięci przekazywanej w wierszu poleceń za pośrednictwem MAVEN_OPTS.

Aby ustawić MAVEN_OPTS w systemie Windows 7:

  1. Kliknij prawym przyciskiem myszy Mój komputer i wybierz Właściwości (skrót klawiszowy naciśnij Windows+ Pause/Break)
  2. Kliknij łącze Zaawansowane ustawienia systemu znajdujące się w lewym panelu nawigacyjnym Właściwości systemu, aby wyświetlić Zaawansowane właściwości systemu
  3. Przejdź do zaawansowanego karcie i kliknij na zmienne środowiskowe przycisku znajdującego się w dolnej części Zaawansowane Właściwości systemu oknie konfiguracyjnym
  4. Utwórz nową zmienną użytkownika, ustaw nazwę zmiennej na MAVEN_OPTS i ustaw wartość zmiennej na -Xmx1024m(lub więcej)

Otwórz nowe okno poleceń i uruchom mvn.

Pascal Thivent
źródło
1
Czy ma to jakiś wpływ na szybkość mojej kompilacji? Czy jest jakaś wskazówka, jak ulepszyć moją kompilację mavena, przydzielając jej więcej pamięci?
Mahendran
45

Jeśli zabraknie miejsca na sterty podczas niezawodnego (lub bezpiecznego) przebiegu testowania JUnit, zmiana MAVEN_OPTS może nie pomóc. Próbowałem różnych konfiguracji w MAVEN_OPTS bez powodzenia, dopóki nie znalazłem tego posta, który rozwiązał problem.

Zasadniczo JUnits rozwidlają się do własnego środowiska i ignorują ustawienia w MAVEN_OPTS. Musisz skonfigurować pewne działanie w swoim pomie, aby dodać więcej pamięci dla JUnits.

Miejmy nadzieję, że może to zaoszczędzić trochę czasu komuś innemu!


Edycja: Kopiowanie rozwiązania z bloga Keitha Chapmana na wypadek, gdyby łącze któregoś dnia pękło:

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

Aktualizacja (31.05.2017): Dziękuję @johnstosh za wskazanie tego - surefire nieco ewoluował, odkąd zamieściłem tę odpowiedź. Oto link do ich dokumentacji i zaktualizowany przykładowy kod (linia arg jest nadal ważną częścią tego pytania):

  <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>
Duży namiot
źródło
To zaoszczędziło mi trochę czasu! Dzięki! Niestety mogę zagłosować tylko raz! :)
javanna
To najbardziej pomocna odpowiedź między innymi, w prawdziwym stylu maven. Dzięki!
Andremoniy
To jest właściwa odpowiedź na pytanie
Jonathan Landrum
1
Zobacz dokumentację na pewno. surefire wersje wcześniejsze niż 2.14 używały parametru forkMode do konfigurowania rozwidleń. Chociaż ten parametr jest nadal obsługiwany w celu zapewnienia zgodności z poprzednimi wersjami, zdecydowanie zachęca się użytkowników do migracji swojej konfiguracji i zamiast tego używania forkCount i reuseForks.
johnstosh
21

Powinno to być to samo polecenie, z wyjątkiem SET zamiast EXPORT

  • set MAVEN_OPTS = -Xmx512m dałoby 512Mb sterty
  • set MAVEN_OPTS = -Xmx2048m dałoby 2Gb sterty
corsiKa
źródło
Zgadzam się, że powinno to być to samo polecenie, ale to nie oznacza, że ​​jest to prawdziwe stwierdzenie, oto dlaczegoC:\my_project>MAVEN_OPTS=-Xmx512m 'MAVEN_OPTS' is not recognized as an internal or external command, operable program or batch file.
Gandalf StormCrow
glowcoder jest trochę źle. Nie musisz EKSPORTOWAĆ zmiennych, ale aby przypisać im wartość, musisz je ustawić.
JeremyP
Możesz także ustawić MAVEN_OPTS jako zmienną środowiskową systemu Windows, jeśli chcesz używać tych samych wartości dla każdej kompilacji.
digitaljoel
@Gandalf trzeba ustawić zestaw przed nim @Jeremy tak, dlatego jest napisane żeby użyć zestawu zamiast eksportu
corsiKa
9

Na komputerze Mac: zamiast JAVA_OPTSi MAVEN_OPTSużyj zamiast tego _JAVA_OPTIONS. To działa!

Steve
źródło
działa to również w systemie Windows. Dodaj to jako zmienną środowiskową w konfiguracji Maven run w eclipse, testy uruchamiane z m2e nie dają już błędu PermGen
fedeb
3

Po próbie użycia zmiennej MAVEN_OPTS bez powodzenia trafiłem na tę stronę, która działała dla mnie. Więc wszystko, co musiałem zrobić, to dodać -Xms128m -Xmx1024m do domyślnych opcji maszyny wirtualnej i zadziałało.

Aby zmienić je w Eclipse, przejdź do Window -> Preferences -> Java -> Installed JREs. Wybierz zaznaczone JRE / JDK i kliknij edytuj.

kent_e
źródło
0

W systemie Windows:

Dodaj zmienną środowiskową (zarówno w zmiennych systemowych, jak i użytkownika, mam dziwny problem, że pobiera zmienną z różnych miejsc, więc dodaję je w obu).

Nazwij go MAVEN_OPTS.

Wartość będzie: -Xms1024m -Xmx3000m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled

Liczby mogą być różne, ułóż je w stosunku do rozmiaru twojego mema.

Miałem ten problem i to go naprawiło, nic więcej!

Hrabia
źródło
0

Zadziałało - Aby zmienić w Eclipse, przejdź do Window -> Preferences -> Java -> Installed JREs. Wybierz zaznaczone JRE / JDK i kliknij edytuj.

Domyślne argumenty maszyny wirtualnej = -Xms128m -Xmx1024m

Anadi Kumar
źródło
-7

Szukasz 2 możliwości java:

  • -Xmx maksymalny rozmiar sterty
  • -Xms początkowy rozmiar sterty

Umieść je w wywołaniu wiersza poleceń javapliku wykonywalnego, na przykład:

java -Xms512M -Xmx1024M my.package.MainClass

Pamiętaj, że możesz chcieć, aby początkowe i maksymalne rozmiary sterty były takie same, w zależności od aplikacji, ponieważ pozwala to uniknąć zmiany rozmiaru sterty w czasie wykonywania (co może zająć trochę czasu w aplikacjach, które muszą reagować). Zmiana rozmiaru sterty może wiązać się z przenoszeniem wielu obiektów i ponownym prowadzeniem księgowości.

W przypadku codziennych projektów rób to, co uważasz za wystarczająco dobre. Profil w celu uzyskania pomocy.

Phil
źródło
1
jak twierdzi ebelisle, ta opcja w ogóle nie zadziała, ponieważ używając Mavena, musicie przynajmniej określić, że jest to opcja Mavena z "-D", ale nadal nie jest to polecenie java, o czym mówimy
frandevel