2011-02-03 2 views
1

Hello을 인쇄 한 다음 Thread.sleep(3600*1000)이 Linux에서 CentOS 5와 Ubuntu 10.04 모두에서 Linux (OpenJDK와 Sun JVM 모두)에서 가상 메모리를 사용하는 이유를 디버깅하려고합니다. 섬기는 사람. (각각 MediaTemple (dv) 및 (ve)).JMX 대 htop로보고 된 Java 메모리

그러나 더 구체적으로 VisualVM 또는 JConsole을 사용하여 연결하면 합리적인 메모리 사용법을 알 수 있습니다. 820KM 힙 (GC 이후); 8.4MB PermGen; 1136 클래스가로드되었습니다.

왜 불일치입니까?

많은 메모리를 사용하여 순전히 JVM을 실행하고 있습니까? 두 개의 Hello 응용 프로그램을 시작하여 메모리 사용량이 선형으로 조정되는지 알아보기 위해 시도했습니다.

사용 된 총 RAM이 78MB로 시작되었습니다. 하나의 hello 앱을 시작하면 메모리 사용량이 376MB가됩니다. 다른 hello 앱을 시작하면 총 RAM 사용량이 656MB가되므로 메모리가 잘 공유되지 않는 것 같습니다. (이 숫자는

(이 특정 숫자는 오픈 JDK와 가상 메모리 아니지만 일 6 JDK를 사용하여) comprable 제공하지만, 약간 낮은 메모리 사용량

코드 :

public class Hello { 
    public static void main(String[] args) throws Throwable { 
     System.out.println("HI"); 
     Thread.sleep(3600 * 1000); 
     return; 
    } 
} 

명령 줄 : JMX와

java -Xmx32m -Xms32m Hello 

:

java -Dcom.sun.management.jmxremote.port=8005 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx32m -Xms32m Hello 

, 당신의 도움을 주셔서 감사합니다

Wiktor

+0

설명 : Hello 용 RES 메모리는 21MB (예상대로)이며 SHR 메모리는 8MB입니다. 모두 합리적인 (잘, 자바에 대한 ;-)). 내 문제는 가상 메모리 사용량을 내 총 허용량 2GB에서 뺀 것입니다 ~ 18 Java 응용 프로그램을 실행해야합니다. – wmacura

+0

'ulimit -v'를 사용하여 가상 메모리 사용을 조정하려고 시도했지만 약 400,000 (400MB)으로 설정하지 않으면 Java 응용 프로그램이 성공적으로 시작되지 않습니다. – wmacura

+0

중요한 효과없이 -Djava.awt.headless = true (Sun과 OpenJDK 모두 사용)를 시도했습니다. – wmacura

답변

1

힙 자바가 사용하는 메모리 영역 중 하나에서만입니다.

은 PermGen 당신이 자바를 사용하도록 허용 얼마나 많은 지정할 수있는 또 다른 하나입니다 Section 3.5 in the Java Virtual Machine Specification Overview

를 참조하십시오.

각 스레드에는 가상 시스템 스택이 있으며이 가상 시스템 스택도 크기를 제한합니다.

컴파일 된 코드를 저장하는 코드 캐시 또는 메서드 영역이 있습니다.

네이티브 메소드 스택이있을 수 있습니다.

메모리 매핑 된 파일 또는 파일의 일부 (예 : jar 파일의 인덱스)는 프로세스의 (힙이 아닌) 메모리 영역을 차지합니다.

+0

답장을 보내 주셔서 감사합니다. 제 질문에 답했습니다. 슬프게도 내 문제를 해결하지는 못했지만 다른 게시물에 대한 것입니다. – wmacura

+0

메모리가 갈 수있는 좋은 예입니다. 그러나 메모리가 Sun/OpenJDK Java 프로세스에있는 경우 _precisely_를 분석하기위한 구체적인 단계가 있습니까? –

+0

섹션 3.5는 JVM 7 스펙의 섹션 2.5에 매핑됩니다. – jjcomer