2012-01-05 1 views
7

기본적으로 우리는 일부 컴퓨터에서 JVM 옵션을 설정하면 -Xmx (최대 힙 크기)로 인해 시스템에 충분한 RAM 이상이 있더라도 JVM이 초기화되지 않는 경우가 있음을 확인했습니다.-Xmx를 너무 높게 설정하면 가끔 RAM이 있더라도 JVM이 실패하게됩니까?

예를 들어, 4GB 시스템에서 -Xmx1024m이 실패했지만 -Xmx800m이 작동합니다. 나는 1GB 기계, 2GB 기계조차도 이해할 수 있지만 4GB 기계에서는 Windows, Linux 등이 RAM을 교환 할 수 있다는 점을 고려할 때 왜 이것이 실패할까요?

최대 힙 크기를 줄이기 위해 많은 스레드와 질문을 보았지만 실제로 실패한 이유를 설명 할 수있는 사람은 아무도 없습니다.

물론, 특정 크기까지 원하는만큼의 메모리를 소비하는 방법은 무엇입니까?

+0

JVM을 사용하면 스왑 공간이 거의 없더라도'-Xmx'를 테라 바이트 단위로 설정할 수 있습니다. 테스트 한 정확한 명령과 JVM 버전을 공유해주십시오. – alf

+0

@alf,'-Xmx'는 단순히 가상 주소 공간의 예약 된 범위의 크기 인 최대 힙 크기를 설정합니다; '-Xms'에 지정된 양만 커밋 된 저장소에 실제로 백업됩니다. 예를 들어 ['VirtualAlloc'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887%28v=vs.85%29.aspx)를보고'MEM_RESERVE'와'MEM_COMMIT '플래그. –

+0

@ JeffreyHantin, 제프리, 할게. 그것이 제가 OP가 무엇을했는지 묻고 있었던 이유입니다. – alf

답변

13

virtual address space fragmentation 일 수 있습니다. DLL의로드 주소, 스레드의 스택 위치, 움직일 수없는 기본 메모리 할당, 커널 예약 주소 등에 따라 연속 1024MB 주소 범위를 힙의 가능한 최대 크기로 예약 할 수 없습니다. 32 비트 프로세스

1

I came across this issue a while ago with Windows XP. 하나의 가장 큰 XP 기계는 1400MB를 할당 할 수 있었고 나머지는 1200MB 만 할당 할 수있었습니다. Jeffrey Hantin이 다른 대답에서 말한 것처럼 합의는 분열이었다.