[maven] Maven 메모리 부족 빌드 실패

오늘부터 내 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>



답변

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

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가 정의 된 메모리를 사용할 수 없다는 문제가 발생할 수 있습니다.


답변

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동일한 프로젝트에서 작업하는 다른 개발자 보다 취약성이 적다는 것 입니다 (설정을 잊어 버린 경우).
또한 다중 모듈 프로젝트의 경우 모든 모듈에 옵션이 적용됩니다.


답변

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

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

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


답변

옵션 추가

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


답변

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

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


답변

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

<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를 사용하십시오.


답변

_JAVA_OPTIONS="-Xmx3G" mvn clean install