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?


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.


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>

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

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!


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.


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!


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


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.