Java 8의 기본 Xmxsize (최대 힙 크기)


81

에서 오라클 설명서를 나는 발견

-Xmxsize 메모리 할당 풀의 최대 크기 (바이트)를 바이트 단위로 지정합니다. 기본값은 시스템 구성을 기반으로 런타임에 선택됩니다.

무엇 않는 시스템 구성은 의미?


1
즉, 시스템에 16GB의 RAM이 있으면 512MB보다 크기가 더 커집니다.
JB Nizet

고마워요, 얼마나 커요?
Vitaly


3
>> 물리적 메모리의 1/4 또는 1GB보다 작습니다. 감사합니다, @alfasin.
Vitaly

4
@Vitaly 1Gb 제한은 -Xmx적어도 Java 8에서는 유지되지 않는 것 같습니다 . 왜냐하면 내 Linux 64 비트 시스템에서 총 메모리가 6Gb 인 jvm에는 기본적으로 -Xmx = 1.5Gb가 있기 때문입니다.
트럼프

답변:


144

구현 및 버전에 따라 다르지만 일반적으로 사용되는 VM (예 : 클라이언트 또는 서버, 참조 -client-server매개 변수) 및 시스템 메모리에 따라 다릅니다 .

종종 client기본값은 실제 메모리의 1/4 또는 1GB (둘 중 더 작은 쪽)입니다.

또한 Java 구성 옵션 (명령 줄 매개 변수)을를 포함한 환경 변수에 "아웃소싱" -Xmx하여 기본값을 변경할 수 있습니다 (새 기본값 지정). 특히 JAVA_TOOL_OPTIONS환경 변수는 모든 Java 도구에서 확인하고 존재하는 경우 사용됩니다 (자세한 내용은 여기여기 ).

다음 명령을 실행하여 기본값을 볼 수 있습니다.

java -XX:+PrintFlagsFinal -version

그것은 당신에게 loooong 목록을 제공 -XmxMaxHeapSize, -Xms이다 InitialHeapSize. 출력을 필터링하거나 (예 : |grepLinux에서) 검색 할 수 있도록 파일에 저장합니다.


11
약간의 추가 java -XX:+PrintCommandLineFlags로 현재 시스템 정보를 기반으로 JVM에서 선택한 힙 크기 (및 기타 정보)를 인쇄 할 수 있습니다.
Cristian Vat

1
@CristianVat 예,하지만 매개 변수는 -XX:+PrintFlagsFinal입니다. 제안한 매개 변수는 저에게 적합하지 않습니다. 대답에 추가하십시오.
icza

맞습니다. -XX:+PrintFlagsFinal모든 정보를 고려한 후 모든 정보를 표시해야하므로 (수동 옵션 및 인체 공학을 포함하여 ) 죄송합니다 . 하지만 -XX:+PrintCommandLineFlags내 JVM에서 작동하는 것 같다 (정확한 버전에 따라 수)
크리스티안 통

2
큰 상자의 경우이 "1/4 RAM"경험 규칙은 확실히 적용되지 않습니다. 4 소켓, 소켓 서버 당 64GB (예 : 256GB RAM)에서 Xmx의 기본값은 ~ 32GB입니다. 32GB는이 시점에서 CompressedOops의 한계와 관련이있을 수 있습니다.
FauxFaux 2015

2
이 인쇄 힙 크기 관련 줄 :java -XX:+PrintFlagsFinal -version | grep HeapSize
Trump 2020-Justice는

37

앞서 언급했듯이 기본값 -Xmxsize(Maximum HeapSize)은 시스템 구성에 따라 다릅니다.

Java8 clientXmssize(Minimum HeapSize)에 대한 물리적 메모리의 -Xmxsize1/64보다 크고 (Maximum HeapSize)에 대한 물리적 메모리의 1/4보다 작습니다.

즉, 실제 메모리가 8GB RAM 인 경우 Xmssize8 * (1/6)은 더 크고 -Xmxsize8 * (1/4) 은 더 작습니다 .

다음을 사용하여 기본 힙 크기를 확인할 수 있습니다.

에서 윈도우 :

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

에서 리눅스 :

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

이러한 기본값은 원하는 양으로 재정의 할 수도 있습니다.



이 링크에 따라 docs.oracle.com/javase/8/docs/technotes/guides/vm/… 최소 / 초기의 기본값은 1/6이 아닌 1/64입니다. "기계 또는 일부 합리적인 최소의 시스템의 물리적 메모리의 1 / 64의 큰"
Vyshnav 라 메쉬 트리 수르

15

놀랍게도이 질문에는 확실한 문서화 된 답변이 없습니다. 아마도 다른 데이터 포인트는 답을 찾는 다른 사람들에게 가치를 제공 할 것입니다. CentOS (6.8,7.3) 및 Java 8 (빌드 1.8.0_60-b27, 64 비트 서버)을 실행하는 내 시스템 :

기본 메모리는 물리적 메모리의 1/4이며 1GB로 제한되지 않습니다.

또한 -XX:+PrintFlagsFinalSTDERR로 인쇄하므로 위의 다른 사용자가 제시 한 현재 기본 메모리를 결정하는 명령은 다음과 같이 조정되어야합니다.

java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize

64GB의 물리적 RAM이있는 시스템에서 다음이 반환됩니다.

uintx MaxHeapSize                                  := 16873684992      {product}

16Gb의 RAM이있는 내 시스템 : 2069889024 = 2Gb.
david.perez

Windows 7 64 비트 (8GB RAM) : 32 비트 JVM : 256MB, 64 비트 JVM : 2GB
golimar

마지막으로 설명서를 발견 stackoverflow.com/a/56036202/32453
rogerdpack

2

내 Ubuntu VM에서 총 1048MB의 RAM이 java -XX:+PrintFlagsFinal -version | grep HeapSize인쇄되어 있습니다. uintx MaxHeapSize := 266338304이는 약 266MB이고 전체 RAM의 1/4입니다.


2
OpenJDK와 Oracle은 서로 다른 특성을 가지고있는 것처럼 보입니다. OpenJDK는 항상 -Xmx로 1/4 RAM을 사용하는 것을 봅니다 (1/4 및 1GB보다 작지 않음)
pogul

1

2019 년 5 월 8 일 현재 :

JVM 힙 크기는 시스템 구성에 따라 다릅니다.

a) 클라이언트 jvm 대 서버 jvm

b) 32 비트 대 64 비트 .

연결:

1) J2SE5.0에서 업데이트 : https://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html
2) 간단한 답변 : https://docs.oracle.com/ javase / 8 / docs / technotes / guides / vm / gctuning / ergonomics.html
3) 자세한 답변 : https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html# default_heap_size
4) 클라이언트 대 서버 : https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html

요약 : (위의 링크에서 이해하기 어렵습니다. 여기에서 요약하면됩니다.)

1) 클라이언트 jvm의 기본 최대 힙 크기는 256mb입니다 (위의 링크에서 읽은 예외가 있음).

2) 32 비트 서버 jvm의 기본 최대 힙 크기는 1GB이고 64 비트는 32GB입니다 (여기서도 예외가 있습니다. 링크에서 읽으십시오).

따라서 기본 최대 jvm 힙 크기는 위의 VM에 따라 256MB 또는 1GB 또는 32GB 입니다.


1
마지막으로 무슨 일이 일어나고 있는지 설명하는 실제 문서로 연결됩니다.
rogerdpack 20.06.06
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.