-Xmxn
Java 명령 행에서 옵션을 생략하면 기본값이 사용됩니다. 자바 문서 에 따르면
"시스템 구성에 따라 런타임시 기본값이 선택됩니다"
어떤 시스템 구성 설정이 기본값에 영향을 줍니까?
-Xmxn
Java 명령 행에서 옵션을 생략하면 기본값이 사용됩니다. 자바 문서 에 따르면
"시스템 구성에 따라 런타임시 기본값이 선택됩니다"
어떤 시스템 구성 설정이 기본값에 영향을 줍니까?
답변:
Windows에서는 다음 명령을 사용하여 응용 프로그램이 실행되는 시스템의 기본값을 찾을 수 있습니다.
java -XX : + PrintFlagsFinal-버전 | findstr 힙 크기
옵션을 찾습니다 MaxHeapSize
(에 대한 -Xmx
) 및 InitialHeapSize
대한 -Xms
.
유닉스 / 리눅스 시스템에서 할 수있는 일
java -XX : + PrintFlagsFinal-버전 | grep 힙 크기
결과 출력이 바이트 단위라고 생각합니다.
InitialHeapSize = 262803264
그리고 MaxHeapSize = 4206886912
에 관한 256메가바이트 및 4기가바이트 내가 잘못 아니에요 경우. 이것은 모든 JVM이 마치 -Xms256m -Xmx4g
옵션 으로 시작된 것처럼 시작한다는 것을 의미합니까 ?
java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
-version
에서 긴 "사용"텍스트를 억제합니다 stderr
.
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입니다.
greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
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"를 사용하면 다소 이상한 오류가 발생합니다.
시스템 구성에 따라 런타임시 기본값이 선택됩니다.
설명서 페이지를보십시오
기본 힙 크기
명령 행에서 초기 및 최대 힙 크기를 지정하지 않으면 시스템의 메모리 양을 기반으로 계산됩니다.
클라이언트 JVM 기본 초기 및 최대 힙 크기 :
기본 최대 힙 크기는 실제 메모리 크기의 최대 192MB (MB)까지 , 그렇지 않으면 실제 메모리의 1/4이 1GB의 실제 메모리 크기입니다 .
서버 JVM 기본 초기 및 최대 힙 크기 :
32 비트 JVM에서 4GB 이상의 실제 메모리가있는 경우 기본 최대 힙 크기는 최대 1GB 입니다. 64 비트 JVM에서 128GB 이상의 실제 메모리가있는 경우 기본 최대 힙 크기는 최대 32GB 일 수 있습니다.
어떤 시스템 구성 설정이 기본값에 영향을 줍니까?
플래그 -Xms (초기 힙 크기) 및 -Xmx (최대 힙 크기)를 사용하여 초기 및 최대 힙 크기를 지정할 수 있습니다 . 애플리케이션이 제대로 작동하는 데 필요한 힙의 양을 알고 있으면 -Xms 및 -Xmx 를 동일한 값으로 설정할 수 있습니다
JVM (Java Virtual Machine)의 플래그는 다음 Xms
과 Xmx
같습니다.
Xms
: initial and minimum
JVMheap size
Format
: -Xmx<size>[g|G|m|M|k|K]
Default Size
:
-server
모드 : 사용 가능한 실제 메모리의 25 %,> = 8MB 및 <= 64MB-client mode
: 사용 가능한 실제 메모리의 25 %,> = 8MB 및 <= 16MBTypical Size
:
-Xms128M
-Xms256M
-Xms512M
Function
/ Effect
:
Xms
크기 메모리로 JVM 시작Xmx
: maximum
JVMheap 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
:
Xmx
크기 메모리 사용 가능
Xmx
하면 의지java.lang.OutOfMemoryError
OutOfMemoryError
?
Xmx
가치를
초과하다-Xmx4g
~에서-Xmx8g
공식 문서 참조 : -X 명령 행 옵션
여러 매개 변수가 생성 크기에 영향을줍니다. 다음 다이어그램은 커밋 된 공간과 가상 공간의 힙 차이를 보여줍니다. 가상 머신을 초기화 할 때 힙의 전체 공간이 예약됩니다. 예약 된 공간의 크기는 -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 % 만 여유 공간이되도록 생성이 축소됩니다.
대규모 서버 응용 프로그램은 종종 이러한 기본값과 관련하여 두 가지 문제가 발생합니다. 초기 힙이 작고 여러 주요 컬렉션에서 크기를 조정해야하기 때문에 시작 속도가 느립니다. 더 심각한 문제는 대부분의 서버 응용 프로그램에서 기본 최대 힙 크기가 부당하게 작다는 것입니다. 서버 응용 프로그램의 경험 법칙은 다음과 같습니다.
일반적으로 할당 수를 병렬화 할 수 있으므로 프로세서 수를 늘리면 메모리가 증가합니다.
있습니다 전체 기사