Java 힙 할당이 2MB의 배수임을 알았습니다. 예를 들어 -Xmx values as 1021m, 1022m
으로 JVM을 시작한 경우 힙 크기가 1022m
인 두 JVM이 모두 시작되었습니다. 마찬가지로 힙 크기 1023m,1024m
은 1024m
으로 시작됩니다.Java 힙 할당은 2MB의 배수입니다.
는 출력은 아래와 같다 : 두 경우
C:\Users\myuser>java -Xmx1021m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1071644672
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
C:\Users\myuser>java -Xmx1022m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1071644672
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
가 1,022메가바이트이다 1,071,644,672 바이트로 MaxHeapSize를 나타낸다.
C:\Users\myuser>java -Xmx1023m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1073741824
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
C:\Users\myuser>java -Xmx1024m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1073741824
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
두 경우 모두 MaxHeapSize는 1,037,378,1824 바이트 (1024MB)입니다.
이 동작은 Xms와 비슷합니다.
질문 1 : 힙 크기가 지정된 값에서 2의 다음 배수로 변경되는 이유는 무엇입니까?
질문 2 : JVM이 실제로
질문 3 지정된 것과 다른 값으로 시작 왜 자바도 우리에게 경고하지 않습니다 플래그 또는 힙을 만들기 위해 JVM을 강제 할 수있는 방법이 있나요 1021mb?
질문 4 : 가설적인 상황에서 1023MB의 여유 메모리가 있습니다. 1023MB의 힙을 가진 JVM을 만들려고합니다. 위의 동작에 의해 실제로 사용할 수없는 1024MB로 시작하려고합니다. JVM 생성이 실패합니까?
이것은 JVM보다는 운영 체제의 제한 사항이라고 생각합니다. 운영 체제는 일반적으로 "메모리 페이지"라는 개념 (처리에 할당 된 최소량의 실제 메모리)을 가지고 있습니다. 각 프로세스는 많은 페이지를 가질 수 있지만 하나의 페이지는 가질 수 없습니다. 귀하의 운영 체제는 페이지 크기가 2MB입니다. –
@ M.Prokhorov 귀하의 의견은 거의 정확합니다, 유일한 수정은 * 가상 * 메모리의 최소 금액입니다. 더 간단한 메모리 페이지 - 가상, 메모리 프레임 - 물리적. – Eugene
@Eugene 어떻게 윈도우 에서뿐만 아니라 리눅스에서 프로세스에 대한 가상 메모리의 최소 금액을 얻을 수 있습니까? –