2013-02-06 2 views
2

매우 기본적인 질문이지만 JVM의 최대 메모리 할당이 응용 프로그램에 어떻게 적용되는지 이해하고 있습니다. 60 개의 가상 관리 서버 (즉, 60 개의 JVM)를 호스팅하는 Windows 2008 서버에서 실행되는 응용 프로그램이 있습니다. 각 관리 서버는 1024m의 최대 힙으로 설정됩니다. Windows는 32GB RAM으로 구성됩니다.JVM 옵션 : Xmx 할당

이제 JVM에 대한 최대 메모리 할당은 어떻게 완료됩니까? 그것은 한 번에 또는 점진적 성장 기반에서 수행됩니까? 한 가지 방법으로 Windows가 32GB RAM 패키지 시스템에서 내 애플리케이션을 호스팅하는 60 개의 관리 서버를 모두 어떻게 처리합니까?

모든 의견을 보내 주시면 감사하겠습니다. 고맙습니다.

+0

1024k (= 1M) 힙이 오타입니까? 그건 당신의 60 서버가 단순한 60 메가 바이트를 사용하는 것입니다, veeeery 효율적인 것 같습니다 ..;) – fgysin

+0

내 나쁜! 그건 실제로 오타입니다. – Srii

답변

3

실제로 JVM은 실행시에 -Xmx이 요청한 모든 메모리와 JVM 실행 파일 및 내부 작업 영역을 보유하는 추가 메모리를 할당합니다. 또한 스레드를 만들 때 해당 스레드에 사용되는 스택에 메모리를 할당합니다.

이것은 (1) JVM이 실제로 이 메모리를으로 사용하지 않으며 (2) OS가 페이징 파일을 제공하기 때문에 작동합니다. JVM이 할당을 요청하면 OS에 의해 커밋을 생성하지만 실제로 요청 된 모든 RAM을 사용하지는 않습니다. 실제로 RAM을 사용하기 때문에 OS는 페이지를 페이지 파일과 페이지 파일간에 교환합니다. 모든 프로세스가 RAM을 적극적으로 사용한다면 운영 체제는 페이지를 지속적으로 내외부로 스왑해야합니다. 이것은 "스 래싱"이라고합니다.

-Xms 매개 변수는 전체 힙 크기가 인 초기 힙 크기 ()를 지정합니다. JVM은 이러한 범위 내에서 메모리를 유지하려고 시도하지만 충분한 가비지를 회수 할 수없는 경우 경계를 확장 할 수 있습니다. 그러나 이러한 힙 증가는 이 아니므로은 점진적으로 OS에서 더 많은 메모리를 요청하지 않습니다. 그랬다면 힙이 조각 나고 대용량 배열 할당이 실패 할 수 있습니다 (인접 메모리에 맞지 않기 때문에).

1

JVM은 처음에 -Xms 옵션 (기본값은 32M, 내가 아는 한)을 통해 지정된 메모리 양을 할당합니다. 이 메모리가 부족하면 -Xmx 옵션 (기본값은 64M)을 통해 지정된 양에 도달 할 때까지 새 메모리를 점진적으로 할당하기 시작합니다.

이 경우 OutOfMemory 오류가 발생합니다.

P. 물론 이것은 매우 단순화 된 알고리즘입니다. 사실, JVM은 훨씬 복잡한 것을 사용합니다.

1

프로세스를 시작할 때마다 할당하려면 -Xms를 제공해야합니다. -Xmx 만 제공하면 VM은 그 값까지 커지지 만 더 많은 메모리가 필요할 때마다 증가합니다.

1

-Xmx 파라미터는 최대 JVM 메모리를 사용할 수있는 지정하지만 즉시 시작 후 OS에서 할당하지 않는다. 을 대개 많은 단계로 수행해야하므로 (예 : JVM의 Java 응용 프로그램이 실행될 때 더 많은 메모리를 요구합니다).

물론 이것이 기본 동작이며 많은 다른 JVM 매개 변수로 변경할 수 있습니다.

관련 문제