[java] 기본 최대 Java 힙 크기는 어떻게 결정됩니까?

-XmxnJava 명령 행에서 옵션을 생략하면 기본값이 사용됩니다. 자바 문서 에 따르면

“시스템 구성에 따라 런타임시 기본값이 선택됩니다”

어떤 시스템 구성 설정이 기본값에 영향을 줍니까?



답변

Windows에서는 다음 명령을 사용하여 응용 프로그램이 실행되는 시스템의 기본값을 찾을 수 있습니다.

java -XX : + PrintFlagsFinal-버전 | findstr 힙 크기

옵션을 찾습니다 MaxHeapSize(에 대한 -Xmx) 및 InitialHeapSize대한 -Xms.

유닉스 / 리눅스 시스템에서 할 수있는 일

java -XX : + PrintFlagsFinal-버전 | grep 힙 크기

결과 출력이 바이트 단위라고 생각합니다.


답변

Java SE 5 : 가비지 콜렉터 인체 공학 에 따르면 [Oracle] :

초기 힙 크기 :

머신에서 머신의 물리적 메모리의 1/64보다 크거나 적당한 최소값. J2SE 5.0 이전에는 기본 초기 힙 크기가 합리적인 최소값으로 플랫폼에 따라 다릅니다. -Xms 명령 행 옵션을 사용하여이 기본값을 대체 할 수 있습니다.

최대 힙 크기 :

실제 메모리의 1/4 또는 1GB보다 작습니다. J2SE 5.0 이전의 기본 최대 힙 크기는 64MB입니다. -Xmx 명령 행 옵션을 사용하여이 기본값을 대체 할 수 있습니다.

최신 정보:

Tom Anderson이 자신의 의견에서 지적한 것처럼 위의 내용은 서버급 시스템입니다. 에서 5.0의 JavaTM 가상 머신에서 인간 공학 :

J2SE 플랫폼 버전 5.0에서는 서버 클래스 머신이라고하는 머신 클래스가 다음과 같은 머신으로 정의되었습니다.

  • 2 개 이상의 물리적 프로세서
  • 2GB 이상의 물리적 메모리

Windows 운영 체제 버전을 실행하는 32 비트 플랫폼을 제외하고. 다른 모든 플랫폼에서 기본값은 버전 1.4.2의 기본값과 동일합니다.

J2SE 플랫폼 버전 1.4.2에서는 기본적으로 다음 항목이 선택되었습니다.

  • 4MB의 초기 힙 크기
  • 64MB의 최대 힙 크기

답변

자바 8 이상 소요 1 / 64 당신을 위해 실제 메모리를 Xmssize (최소 힙 크기) 미만 1 / 4 귀하에 대한 물리적 메모리의 -Xmxsize (최대 힙 크기).

다음과 같이 기본 Java 힙 크기 를 확인할 수 있습니다 .

에서 윈도우 :

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

에서 리눅스 :

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

어떤 시스템 구성 설정이 기본값에 영향을 줍니까?

머신의 물리적 메모리 및 Java 버전.


답변

이것은 Java 6 업데이트 18 에서 변경되었습니다 .

우리가 1GB 이상의 물리적 메모리를 가지고 있다고 가정하면 (요즘 매우 일반적) 서버 vm에 대한 물리적 메모리의 1/4입니다.


답변

Ernesto가 옳다. 그가 게시 한 링크에 따르면 [1] :

업데이트 된 클라이언트 JVM 힙 구성

클라이언트 JVM에서 …

  • 기본 최대 힙 크기는 실제 메모리의 절반이며 실제 메모리 크기는 192MB이며, 그렇지 않으면 실제 메모리의 1/4은 실제 메모리 크기는 1 기가 바이트입니다.

    예를 들어, 시스템에 128MB의 실제 메모리가있는 경우 최대 힙 크기는 64MB이고 실제 메모리의 1 기가 바이트 이상은 최대 힙 크기가 256MB입니다.

  • 프로그램이 충분한 오브젝트를 작성하지 않으면 JVM이 실제로 최대 힙 크기를 사용하지 않습니다. 초기 힙 크기라고하는 훨씬 적은 양이 JVM 초기화 중에 할당됩니다. …

  • 서버 JVM 힙 구성 인체 공학은 이제 클라이언트와 동일하지만 32 비트 JVM의 기본 최대 힙 크기는 1 기가 바이트 이고 실제 메모리 크기는 4 기가 바이트이고 64 비트 JVM의 경우 32 기가 바이트입니다 . 실제 메모리 크기는 128 기가 바이트입니다.

[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html


답변

IBM JVM의 경우 명령은 다음과 같습니다.

java -verbose:sizes -version

IBM SDK for Java 8에 대한 자세한 정보는 http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendixes/defaults.html ? lang = en


답변

드디어!

Java 8u191부터는 다음과 같은 옵션이 있습니다.

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

사용 가능한 실제 RAM의 백분율로 힙 크기를 조정하는 데 사용할 수 있습니다. (커널이 사용하는 RAM이 적은 RAM과 동일).

Java8 u191 릴리스 노트를 참조하십시오. . 옵션은 Docker 제목 아래에 언급되어 있지만 실제로는 Docker 환경이든 기존 환경이든 상관없이 적용됩니다.

의 기본값 MaxRAMPercentage 은 25 %입니다. 이것은 매우 보수적입니다.

내 자신의 규칙 : 호스트가 주어진 Java 응용 프로그램을 실행하는 데 전념하고 있다면 문제없이 크게 증가 할 수 있습니다. Linux에서 표준 데몬 만 실행하고 1Gb 이상에서 RAM을 설치 한 경우 주저하지 말고 JVM 힙에 75 %를 사용하십시오. 다시 말하지만, 이것은 설치된 RAM이 아니라 사용 가능한 RAM의 75 %입니다. . 남은 것은 호스트에서 실행될 수있는 다른 사용자 랜드 프로세스와 JVM에 필요한 다른 유형의 메모리 (예 : 스택)입니다. 모두 함께, 이것은 일반적으로 남은 25 %에 잘 맞습니다. 분명히 더 많은 RAM이 설치되어 있으면 75 %가 더 안전하고 더 안전합니다. (JDK 사람들이 사다리를 지정할 수있는 옵션을 구현했으면 좋겠습니다)

MaxRAMPercentage옵션 설정은 다음과 같습니다 :

java -XX:MaxRAMPercentage=75.0  ....

이 백분율 값은 ‘double’유형이므로 소수점으로 지정 해야합니다 . “75.0”대신 “75”를 사용하면 다소 이상한 오류가 발생합니다.