2012-03-15 2 views
9

최대 힙 크기가 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을 사용하고 있습니다.

+2

새로운 Thread()를 무제한으로 만들고 있습니까? 스폰하는 각 원시 스레드에는 Java 힙의 일부가 아닌 메모리 스택이 있습니다. – Affe

+0

메모리 사용량은 어느 정도입니까? 할당 된 실제 콘텐츠가없는 할당 된 주소 공간은 사용자가 관심을 두지 않을 것입니다. VIRT가 아니라 RSS를 측정하고 있는지 확인하십시오. –

+0

@Affe 스레딩 문제가 아닙니다. 응용 프로그램은 단일 스레드입니다. – jjcarver

답변

4

-Xmx에 의해 제어되는 자바 힙 이외에 여러 메모리 싱크가 있습니다

  • 스레드 스택을
  • PermGen 공간은
  • 직접 ByteBuffersByteBuffer
  • 메모리는 네이티브 코드/라이브러리
  • 을 할당 한 매핑 된

알지 못함 당신의 시스템에서 나는 무언가가 매핑 된 ByteBuffers을 사용한다고 추측 할 것입니다.

그러나 pmap 명령의 출력을 검사하여 문제를 파헤 칠 수 있습니다. 모든 영역이 매핑 된 파일 이름과 함께 프로세스의 모든 메모리 영역을 나열합니다 (영역 이 물론 매핑 된 경우).

+1

pmap 결과물에서 불행하게도 심각하게 불쾌감을주는 메모리 영역은 모두 "매핑"열에 "anon"을 갖습니다. '000000052d4c0000 7722240 0 0 rw --- [anon]' – jjcarver

+0

anon' regions는 위의 목록을 "native libs"와 "direct ByteBuffers"로 줄입니다. –

관련 문제