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


420

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

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

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


1
시스템 구성은 a) 클라이언트 jvm 대 서버 jvm b) 32 비트 대 64 비트를 의미합니다. 링크 : 1) J2SE5.0 docs.oracle.com/javase/6/docs/technotes/guides/vm/… 에서 업데이트 2) 간단한 답변 : docs.oracle.com/javase/8/docs/technotes/guides/vm / gctuning /… 3) 자세한 답변 : docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/… 4) 클라이언트와 서버 : javacodegeeks.com/2011/07/jvm-options-client- vs-server.html
Vyshnav Ramesh Thrissur

2
위의 링크에서 이해하기가 어렵습니다. 클라이언트 jvm의 최대 힙 크기는 256mb입니다 (위의 링크에서 읽은 예외가 있음). 32 비트 서버 jvm의 최대 힙 크기는 1GB이고 64 비트는 32GB입니다 (다시 예외가 있습니다. 링크에서이를 읽으십시오). 256MB 또는 1GB 또는 32GB
Vyshnav Ramesh Thrissur

답변:


506

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

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

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

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

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

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


3
나는 이와 같은 좋은 옵션을 원했지만 IBM의 Java 6 VM을 사용하면 효과가 없었다.
Matt Lavin

큰! 이 모든 기본 옵션을 사용할 수 있습니까? 각각에 해당하는 ENV 변수는 무엇입니까?
Elist

28
내 리눅스에 경우에, InitialHeapSize = 262803264그리고 MaxHeapSize = 4206886912에 관한 256메가바이트4기가바이트 내가 잘못 아니에요 경우. 이것은 모든 JVM이 마치 -Xms256m -Xmx4g옵션 으로 시작된 것처럼 시작한다는 것을 의미합니까 ?
Yuriy Nakonechnyy

9
Windows 시스템에서 :java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
sp00m

1
@matanster 내 리눅스 -version에서 긴 "사용"텍스트를 억제합니다 stderr.
Franklin Yu

115

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의 최대 힙 크기

4
주의 사항 : 그것은 클라이언트 클래스가 아닌 서버 클래스 컴퓨터를위한 것입니다. 해당 용어와 클라이언트 클래스 시스템에 발생하는 사항을 정의하는 java.sun.com/docs/hotspot/gc5.0/ergo5.html 과 함께 해당 문서를 읽어야합니다 . dogbane, 관련 구절을 인용하기 위해 답을 편집하도록 겸손히 제안 해 주시겠습니까?
Tom Anderson

3
이는 2012 년에 엄청나게 낮은 기본값입니다. 64MB 내에 들어가는 심각한 응용 프로그램은 거의 없습니다.
Mark E. Haase

1
Java 6 업데이트 18 이후 클라이언트 시스템에 대한 Ernesto의 2012 년 10 월 30 일 답변을 참조하십시오.
Andy Thomas

또한 힙 크기에 대한 경계와 분수는 J2SE 5.0에 적합하며 컴퓨터가 더 강력 해짐에 따라 후속 릴리스에서는 다를 수 있습니다.
Lodovik

그건 그렇고,이 알고리즘은 Parallel Garbage Collector 전용입니다.
Mike Argyriou

45

자바 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 버전.


5
1/6 대신 1/64 아닌가요?
Vyshnav Ramesh Thrissur

1
예 Xmssize (최소 HeapSize / InitialHeapSize)는 실제 메모리의 1/64보다 크며 Xmxsize (Maximum HeapSize / MaxHeapSize)는 실제 메모리의 1/4보다 작습니다. = 4294967296 {제품}, 난, 전자 XMS는 268메가바이트 &의 -Xmx이다가 4.29 GB입니다 : = 268,435,456 {제품} uintx MaxHeapSize : (내 Mac 용 갖는 16 기가 바이트 램 예를 들어, 나는 uintx InitialHeapSize 무엇입니까
sjethvani

1
답변을 수정하십시오. 1/6이 아니라 1/64입니다.
emeraldhieu

35

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

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


8
잘못된 링크 된 페이지가 말한다greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
파올로 Fulgoni

5
방금 5GB 물리적 메모리가있는 Linux 시스템을 확인했습니다. 1.5GB로 최대 힙 쇼를 기본
에르네스토

1
@PaoloFulgoni no, 내가 지금 관찰하는 또 다른 실제적인 예 : 129GB의 실제 메모리는 32GB의 최대 힙 크기
Kirill

이것이 올바른 이유는 apl의 답변을 참조하십시오 . stackoverflow.com/a/13310792/32453도 참조 stackoverflow.com/a/56036202/32453
rogerdpack

16

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



8

드디어!

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"를 사용하면 다소 이상한 오류가 발생합니다.


7

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

설명서 페이지를보십시오

기본 힙 크기

명령 행에서 초기 및 최대 힙 크기를 지정하지 않으면 시스템의 메모리 양을 기반으로 계산됩니다.

  1. 클라이언트 JVM 기본 초기 및 최대 힙 크기 :

    기본 최대 힙 크기는 실제 메모리 크기의 최대 192MB (MB)까지 , 그렇지 않으면 실제 메모리의 1/4이 1GB의 실제 메모리 크기입니다 .

  2. 서버 JVM 기본 초기 및 최대 힙 크기 :

    32 비트 JVM에서 4GB 이상의 실제 메모리가있는 경우 기본 최대 힙 크기는 최대 1GB 입니다. 64 비트 JVM에서 128GB 이상의 실제 메모리가있는 경우 기본 최대 힙 크기는 최대 32GB 일 수 있습니다.

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

플래그 -Xms (초기 힙 크기) 및 -Xmx (최대 힙 크기)를 사용하여 초기 및 최대 힙 크기를 지정할 수 있습니다 . 애플리케이션이 제대로 작동하는 데 필요한 힙의 양을 알고 있으면 -Xms-Xmx 를 동일한 값으로 설정할 수 있습니다


5

JVM (Java Virtual Machine)의 플래그는 다음 XmsXmx같습니다.

  • Xms: initial and minimumJVMheap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • -server 모드 : 사용 가능한 실제 메모리의 25 %,> = 8MB 및 <= 64MB
      • -client mode: 사용 가능한 실제 메모리의 25 %,> = 8MB 및 <= 16MB
    • Typical Size:
      • -Xms128M
      • -Xms256M
      • -Xms512M
    • Function/ Effect:
      • -> 할당 Xms크기 메모리로 JVM 시작
  • Xmx: maximumJVMheap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • <= R27.2
        • Windows: 75%총 실제 메모리1GB
        • Linux/Solaris: 50%사용 가능한 실제 메모리1GB
      • >= R27.3
        • Windows X64: 75%총 실제 메모리2GB
        • Linux/Solaris X64: 50%사용 가능한 실제 메모리2GB
        • Windows x86: 75%총 실제 메모리1GB
        • Linux/Solaris X86: 50%사용 가능한 실제 메모리1GB
    • Typical Size:
      • -Xmx1g
      • -Xmx2084M
      • -Xmx4g
      • -Xmx6g
      • -Xmx8g
    • Function/ Effect:
      • -> JVM에서 최대 Xmx크기 메모리 사용 가능
        • 초과 Xmx하면 의지java.lang.OutOfMemoryError
          • 수정하는 방법 OutOfMemoryError?
            • Xmx가치를 초과하다
              • 예 : -Xmx4g~에서-Xmx8g

자세한 세부 사항

공식 문서 참조 : -X 명령 행 옵션


JRockit JVM이 아닌가요? (Oracle의 핫스팟 JVM과 반대)
peterh

4

여러 매개 변수가 생성 크기에 영향을줍니다. 다음 다이어그램은 커밋 된 공간과 가상 공간의 힙 차이를 보여줍니다. 가상 머신을 초기화 할 때 힙의 전체 공간이 예약됩니다. 예약 된 공간의 크기는 -Xmx옵션 으로 지정할 수 있습니다 . -Xms매개 변수 값이 매개 변수 값보다 작 으면 -Xmx예약 된 모든 공간이 가상 머신에 즉시 커밋되지는 않습니다. 커밋되지 않은 공간은이 그림에서 "가상"으로 표시됩니다. 힙의 다른 부분 (영구 세대, tenured 세대 및 젊은 세대)은 필요에 따라 가상 공간의 한계까지 커질 수 있습니다.

여기에 이미지 설명을 입력하십시오

기본적으로 가상 시스템은 각 컬렉션에서 힙을 늘리거나 줄여 특정 범위 내의 각 컬렉션에있는 라이브 개체에 대한 여유 공간의 비율을 유지하려고합니다. 이 대상 범위는 매개 변수- XX:MinHeapFreeRatio=<minimum>및 로 백분율로 설정되며 -XX:MaxHeapFreeRatio=<maximum>총 크기는로 표시 -Xms<min>됩니다 -Xmx<max>.

파라미터 기본값

MinHeapFreeRatio 40

MaxHeapFreeRatio 70

-Xms 3670k

-Xmx 64 분

64 비트 시스템에서 힙 크기 매개 변수의 기본값이 약 30 % 확장되었습니다. 이 증가는 64 비트 시스템에서 더 큰 크기의 객체를 보완하기위한 것입니다.

이러한 매개 변수를 사용하면 한 세대의 사용 가능한 공간 백분율이 40 % 아래로 떨어지면 40 %의 여유 공간을 유지하도록 생성이 확장되어 최대 허용 크기까지 생성됩니다. 마찬가지로 여유 공간이 70 %를 초과하면 생성의 최소 크기에 따라 공간의 70 % 만 여유 공간이되도록 생성이 축소됩니다.

대규모 서버 응용 프로그램은 종종 이러한 기본값과 관련하여 두 가지 문제가 발생합니다. 초기 힙이 작고 여러 주요 컬렉션에서 크기를 조정해야하기 때문에 시작 속도가 느립니다. 더 심각한 문제는 대부분의 서버 응용 프로그램에서 기본 최대 힙 크기가 부당하게 작다는 것입니다. 서버 응용 프로그램의 경험 법칙은 다음과 같습니다.

  • 일시 정지에 문제가없는 한 가상 머신에 가능한 많은 메모리를 부여하십시오. 기본 크기 (64MB)는 종종 너무 작습니다.
  • -Xms 및 -Xmx를 동일한 값으로 설정하면 가상 시스템에서 가장 중요한 크기 결정을 제거하여 예측 가능성이 높아집니다. 그러나 선택을 잘못하면 가상 시스템이 보상 할 수 없습니다.
  • 일반적으로 할당 수를 병렬화 할 수 있으므로 프로세서 수를 늘리면 메모리가 증가합니다.

    있습니다 전체 기사

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