최대 힙 크기가 128MB (-Xmx128M) 인 Java 응용 프로그램을 실행 중입니다. OutOfMemoryError 또는 처리되지 않은 다른 예외없이 성공적으로 완료됩니다. 따라서 실제 힙 크기가 선언 된 한계 인 128MB 내에 머물렀다 고 가정합니다.왜 JVM의 전체 메모리 사용량이 Xmx 값보다 30 배 이상입니까?
그러나이 Java 응용 프로그램의 프로세스를 관찰 할 때 최대 총 메모리 사용량은 4,188,548KB (~ 4GB)입니다. 이것은 힙의 제어 된 최대 크기의 30 배 이상 증가합니다. 이 값에는 사용 된 실제 실제 메모리보다 크게 할당 된 가상 메모리가 포함되어 있음을 이해하지만 Sun Grid Engine에 의해 부과 된 것과 같은 하드 한계에 영향을 미치므로 의미가 있습니다.
정확히 어떻게 가능합니까? JVM에 의해 소비되는 총 메모리에는 힙 크기보다 많은 양이 포함되어 있지만 응용 프로그램이 실제로 객체를 만들고 계산을 수행하는 데 필요한 것 이상으로 수 GB의 추가 메모리가 필요할 수 있음을 이해하지 못합니다. .
64 비트 RHEL Linux 배포에서 Sun Java 1.6.0.31을 사용하고 있습니다.
새로운 Thread()를 무제한으로 만들고 있습니까? 스폰하는 각 원시 스레드에는 Java 힙의 일부가 아닌 메모리 스택이 있습니다. – Affe
메모리 사용량은 어느 정도입니까? 할당 된 실제 콘텐츠가없는 할당 된 주소 공간은 사용자가 관심을 두지 않을 것입니다. VIRT가 아니라 RSS를 측정하고 있는지 확인하십시오. –
@Affe 스레딩 문제가 아닙니다. 응용 프로그램은 단일 스레드입니다. – jjcarver