Maven 메모리 부족 빌드 실패


89

오늘부터 내 maven 컴파일이 실패합니다.

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

[오류] 메모리가 부족합니다. 메모리 양을 늘리려면 시작시 -Xmx 플래그를 사용하십시오 (java -Xmx128M ...)

어제 저는 maven 컴파일을 성공적으로 실행했습니다.

오늘부터 저는 힙을 3GB로 올렸습니다 . 또한 2-3 줄의 작은 코드 만 변경했기 때문에이 '메모리 부족'오류를 이해하지 못합니다.

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

편집 : 실패한 모듈의 pom.xml을 변경하여 포스터의 의견을 시도했습니다. 하지만 동일한 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>

1
더 많은 스택 추적을 제공 할 수 있습니까? 문자열 초기화로 인해 메모리가 부족한 원인이 무엇인지 궁금합니다. MAVEN_OPTS에서 힙 크기를 설정하는 것은 갈 길처럼 들리지만 내 생각에는 어딘가에 충분히 할당하지 않을 수있는 엄청나게 큰 String이 있다는 것입니다 -Xmx.
에드워드 삼손

답변:


138

어떤 종류의 '웹'모듈에 대해 이야기하고 있습니까? 단순한 전쟁이고 포장 형 전쟁이 있습니까?

Google의 웹 툴킷 (GWT)을 사용하지 않는 경우 제공 할 필요가 없습니다. gwt.extraJvmArgs

컴파일 프로세스를 포크하는 것은 최선의 생각이 아닐 수 있습니다. 왜냐하면 MAVEN_OPTS완전히 무시하는 두 번째 프로세스를 시작하기 때문에 분석이 더 어려워지기 때문입니다.

그래서 MAVEN_OPTS를 설정하여 Xmx를 늘리려 고합니다.

export MAVEN_OPTS="-Xmx3000m"

컴파일러를 다른 프로세스로 포크하지 마십시오.

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

-XX:MaxPermSize=512m파마 크기가 문제의 원인이라면 증가 가 필요하지 않아야합니다.java.lang.OutOfMemoryError: PermGen space

그래도 문제가 해결되지 않으면 추가 분석을 위해 힙 덤프를 만들 수 있습니다 -XX:+HeapDumpOnOutOfMemoryError. 또한 컴파일이 실행되는 동안 Java bin 디렉토리의 jconsole.exe를 사용하여 jvm에 연결하고 jvm의 힙 내부에서 진행되는 작업을 확인할 수 있습니다.

나에게 떠오른 또 다른 아이디어 (어리석은 것일 수도 있음), 컴퓨터 내부에 충분한 RAM이 있습니까? 메모리 크기를 정의하는 것은 좋지만 호스트에 4GB 만 있으면 이미 OS, Java, MS-Office에서 사용하고 있기 때문에 Java가 정의 된 메모리를 사용할 수 없다는 문제가 발생할 수 있습니다.


답장을 보내 주셔서 감사합니다. 분기 된 JVM을 제거하라는 제안이 'maven-surefire-plugin'에도 적용됩니까? 내 MAVEN_OPTS 메모리를 3000으로 늘리기위한 제안을 시도했습니다. 내 maven-compiler에는 분기 된 JVM에 대한 설정이 없으므로 아무것도 변경할 필요가 없습니다. 예, 게스트 VM에는 4GB의 RAM이 있습니다. 호스트 컴퓨터에는 8GB RAM이 있습니다.
Kevin Meredith

2
그건 그렇고, mvn 빌드가 귀하의 제안으로 다시 실패했습니다.
Kevin Meredith

1
일반적으로 프로세스 포크를 실행하지 않는 한 피하려고합니다. 시스템에 4GB 만있는 경우 OS에서 ~ 1GB가 사용됩니다. 따라서 3GB 휴식이 있습니다. maven이 Xms = 1GB로 시작하면 나머지 여유 메모리는 2GB입니다. 다음으로 컴파일러 포크는 Xms = 1GB ....로 시작하여 여유 메모리를 1GB로 줄입니다. 이제 분기 된 failsafe-plugin 프로세스 인 PermGen 메모리 128MB를 뺄 수 있습니다. ... Xmx 설정을 볼 수 있듯이 메모리가 단순하지 않고 자유롭지 않기 때문에 JVM으로 사용할 수 없을 것입니다. JConsole을 사용해 보셨습니까? 및 HeapDumpOnOutOfMemoryError?
vach

MAVEN_OPTS에서 Xms1024m을 제거했지만 mvn 빌드는 여전히 실패했습니다. MAVEN_OPTS에 "HeapDump ..."를 추가했지만 덤프가 인쇄되는 위치가 확실하지 않습니다. 지금 JConsole을 살펴보십시오.
Kevin Meredith

덤프는 jvms 디렉토리에 있습니다
vach

37

MAVEN_OPTSMaven에 전달할 공통 환경 변수가 아닌 또 다른 옵션을 언급하기 위해 늦게 대답 하여 필요한 JVM 옵션을 빌드합니다.

Maven 3.3.1 부터는 .mvn관련 프로젝트의 일부로 폴더를 가질 수 있고 jvm.config이러한 옵션을위한 완벽한 장소로 파일을 가질 수 있습니다 .

프로젝트 소스 트리의 기본 디렉토리에있는 두 개의 새로운 선택적 구성 파일 .mvn/jvm.config.mvn/maven.config. 존재하는 경우 이러한 파일은 기본 jvm 및 maven 옵션을 제공합니다. 이러한 파일은 프로젝트 소스 트리의 일부이므로 모든 프로젝트 체크 아웃에 표시되며 프로젝트가 빌드 될 때마다 자동으로 사용됩니다.

공식 출시 노트의 일부

Maven에서는 프로젝트별로 JVM 구성을 정의하는 것이 간단하지 않습니다. 환경 변수 MAVEN_OPTS및의 사용을 기반으로하는 기존 메커니즘 ${user.home}/.mavenrc은 프로젝트에 속하지 않는 단점이있는 다른 옵션입니다.

이 릴리스부터는 ${maven.projectBasedir}/.mvn/jvm.config파일을 통해 JVM 구성을 정의 할 수 있습니다. 즉, 프로젝트별로 빌드 옵션을 정의 할 수 있습니다. 이 파일은 프로젝트의 일부가되며 프로젝트와 함께 체크인됩니다. 따라서 더 이상 MAVEN_OPTS, .mavenrc파일이 필요하지 않습니다 . 예를 들어 다음 JVM 옵션을 ${maven.projectBasedir}/.mvn/jvm.config파일에 넣는 경우 :

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

이 접근 방식의 가장 큰 장점은 구성이 관련 프로젝트에 격리되고 전체 빌드에도 적용되며 MAVEN_OPTS동일한 프로젝트에서 작업하는 다른 개발자 보다 취약성이 적다는 것 입니다 (설정을 잊어 버린 경우).
또한 다중 모듈 프로젝트의 경우 모든 모듈에 옵션이 적용됩니다.


2
JDK 8을 사용하는 경우 MaxPermSize는 무시됩니다.
GeraldScott

15

Lowend 512Mb ram VPS와 좋은 CPU를 사용하여 "새로 설치"를 컴파일하는 데 동일한 문제가 발생했습니다. OutOfMemory 및 종료 된 스크립트를 반복적으로 실행하십시오.

나는 사용 export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"하고 일했습니다.

Maven이 처음 필요하기 때문에 여전히 다른 컴파일 실패가 발생하지만 OutOfMemory 문제가 사라졌습니다.


11

옵션 추가

-XX:MaxPermSize=512m

MAVEN_OPTS로

maven-compiler-plugin 옵션

  <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
이 게시물을 작성한 후 실제로 -XX : MaxPermSize = 1024m 옵션을 추가했습니다. 하지만 여전히 메모리 부족 오류가 있습니다. 또 다른 SO 게시물은 maven-surefire-plugin의 argLine에 옵션을 추가하여 분기 스레드에서 사용하는 메모리를 늘려야한다고 언급했습니다. 나는 그것을 <argLine> -Xms256m -Xmx1024m -XX : PermSize = 128m -XX : MaxPermSize = 512m </ argLine>로 증가 시켰습니다
Kevin Meredith

말 했어야했는데 ... 아뇨, 메이븐 빌드는 여전히 실패했습니다.
Kevin Meredith

에 모든 속성을 추가 maven-compilier-plugin하고 증가 -XX:MaxPermSize, Xmx해야 =XX:MaxPermSize
일리아

또한 <fork> true </ true> 옵션을 사용하십시오maven-compilier-plugin
Ilya

나는 그것을 시도했지만 (원래 게시물을 참조하십시오) 내 mvn 빌드는 여전히 실패했습니다.
Kevin Meredith

4

Druid.io를 컴파일 할 때 동일한 문제가 발생하여 MaxDirectMemorySize를 늘려 마침내 효과가있었습니다.

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

흥미롭게도 MaxDirectMemorySize는 표면 상 기본적으로 제한이 없습니다 (즉, 기존 제한을 조정하지 않고 제한을 추가했습니다).
토 메르 게이블

4

내 경우에는 아래 구성이 작동합니다.

<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 대신 -XX : MaxPermSize를 사용하십시오.



3

어떤 유형의 OS에서 실행 중입니까?

2GB 이상의 RAM을 할당하려면 최소 64 비트 OS 여야합니다.

또 다른 문제가 있습니다. OS에 무제한 RAM이 있지만 2GB의 단일 여유 블록을 사용할 수없는 방식으로 조각화되어 있어도 메모리 예외가 발생합니다. 일반 힙 메모리는 VM 프로세스가 사용하는 메모리의 일부일뿐입니다. 따라서 32 비트 컴퓨터에서는 Xmx를 2048MB로 설정할 수 없을 것입니다.

또한 최소 및 최대 메모리를 동일한 값으로 설정하는 것이 좋습니다.이 경우 VM의 메모리가 부족 해지면 처음부터 1GB가 할당되고 VM은 새 블록을 할당합니다 ( 500MB 블록)의 1,5GB가 할당 된 후 블록 1의 모든 항목을 새 블록으로 복사하고 그 후에는 메모리를 확보합니다. 메모리가 다시 부족 해지면 2GB가 할당되고 1,5GB가 복사되어 일시적으로 3,5GB의 메모리가 할당됩니다.


1

Unix / Linux 플랫폼에서 프로젝트를 빌드하는 동안 Maven 옵션 구문을 아래와 같이 설정합니다. 이중 qoutation이 아니라 단일 qoutation 기호에 유의하십시오.

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

0

.mvn / jvm.config를 사용하면 저에게 효과적이며 프로젝트와 연결된다는 추가 이점이 있습니다.


0

이것은 cygwin이나 다른 리눅스 에뮬레이터 (git bash)를 사용할 때 Windows의 큰 프로젝트에서 발생합니다. 우연히도 둘 다 내 프로젝트에서 작동하지 않습니다. 큰 오픈 소스 프로젝트입니다. sh 스크립트에서 몇 개의 mvn 명령이 호출됩니다. 메모리 크기는 Xmx에 지정된 것보다 더 큰 힙 크기로 증가하며 대부분의 경우 두 번째 Windows 프로세스가 시작됩니다. 이로 인해 메모리 소비가 더욱 높아집니다.

이 경우 해결책은 배치 파일을 사용하고 Xmx 크기를 줄인 다음 maven 작업이 성공하는 것입니다. 관심이 있으시면 자세한 내용을 알려 드릴 수 있습니다.


0

누군가 이미 32 비트 OS의 문제를 언급했습니다. 제 경우에는 32 비트 JDK로 컴파일하는 것이 문제였습니다.


0

환경 변수 'MAVEN_OPTS'에서 메모리 크기를 늘리면이 문제를 해결하는 데 도움이됩니다. 나를 위해 -Xmx756M에서 -Xmx1024M으로 증가하면 효과가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.