2011-01-31 1 views
2

간단한 프로그램 :가상 메모리에서 400M을 사용하는 Java는 무엇이며 어떻게 사용합니까?

public class SleepTest { 
    public static void main(String[] args) throws InterruptedException { 
     Thread.sleep(60 * 1000); 
    } 
} 

그런 다음

$ javac SleepTest.java 
$ java -cp . SleepTest 

오픈 JDK 1.6.0_20를 들어이 내 컴퓨터에 가상 메모리 600M를 사용합니다! 즉, "위쪽"은 "VIRT"600M 및 RES 10m을 나타냅니다. (우분투 10.04, 32 비트 또는 64 비트).

Sun의 Java 1.6.0_22의 경우 400M의 가상 메모리를 사용합니다.

가상 메모리를 모두 사용하고 있으며 그 사용을 어떻게 낮 춥니 까?

전체 "자바 -version"

오픈 JDK :

java version "1.6.0_20" 
OpenJDK Runtime Environment (IcedTea6 1.9.4) (6b20-1.9.4-0ubuntu1~10.04.1) 
OpenJDK Client VM (build 19.0-b09, mixed mode, sharing) 

일 :

$ /usr/lib/jvm/java-6-sun-1.6.0.22/jre/bin/jav -version 
java version "1.6.0_22" 
Java(TM) SE Runtime Environment (build 1.6.0_22-b04) 
Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing) 

편집 :

패키지 중 하나에서 javac의와 컴파일은 '아무튼 도와 줄 것 같아.

Memory: used 0.3M free 15.2M total 15.5M max 247.5M 

오픈 JDK :

private static String megabyteString(long bytes) { 
    return String.format("%.1f", ((float)bytes)/1024/1024); 
} 
private static void printUsedMemory() { 
    Runtime run = Runtime.getRuntime(); 
    long free = run.freeMemory(); 
    long total = run.totalMemory(); 
    long max = run.maxMemory(); 
    long used = total - free; 
    System.out.println("Memory: used " + megabyteString(used) + "M" 
      + " free " + megabyteString(free) + "M" 
      + " total " + megabyteString(total) + "M" 
      + " max " + megabyteString(max) + "M"); 
} 

일을 보여줍니다 심지어 -Xmx5m와

Memory: used 0.2M free 15.3M total 15.5M max 494.9M 

을 다음과 같이

몇 가지 코드를 추가하면 사용하여 인쇄하는 메모리입니다 그래서 그것은 최소값을 가져야한다. 음? 나는 기본값 (jvm, 가상 머신, 기본적으로 물리적 메모리의 4 분의 1에 해당하는 일반적인 전략에 따라 다름)에 대해 읽었지 만, 큰 가상 메모리 사용을 유발하고 그것을 줄일 수는 없습니까?

편집 # 2 :

$ java -Xmx5m -cp . SleepTest 

오픈 JDK :

$ java -Xmx5m SleepTest 
Memory: used 0.2M free 4.7M total 4.9M max 5.8M 

는 "전용"가상 메모리 150M JVM 중 하나에 사용

는 -Xmx를 추가하는 일을 변경합니다.

편집 # 3 :

번호, bestsss, Mikaveli, 그리고 어쩌면 다른 사람은 가상 메모리 스왑을 사용하지 않는 것을 지적했다. NOS는 OOM 킬러가 실제 메모리 사용으로 갈만큼 똑똑하다고 주장합니다. 그런 것들이 사실이라면 가상 메모리 사용에 신경 쓰지 않을 것입니다. RES (레지던트 크기)가 작아서 좋습니다.

편집 # 4 : 받아 답변하는

확실하지. 가상 메모리가 저렴하기 때문에 걱정하지 마십시오. 또는 -Xmx 또는 -Xms와 상관없이 Java가 가상 메모리에 적어도 150M을 예약하는 이유에 대한 설명이 있습니다. 실제 메모리 사용량은 아주 적습니다.

편집 # 5는 :

이것은 dup이다. 나는 투표하기로 결심했다.

+0

너무 많이 우리가 더 많은 정보없이 확인할 수 있습니다 (같은 당신을 위해 간다)가있다. 프로그램을 실행하고 힙 덤프를 얻어야합니다. Java 응용 프로그램을 실행하는 pid에 대해 jmap을 실행 한 다음 Eclipse MAT와 같은 도구에서 파싱합니다. –

+0

유용한 도구로는 VisualVM이 있습니다. https://visualvm.dev.java.net/ –

+1

가상 메모리 크기가 걱정되는 이유는 무엇입니까? 주소 공간이 부족합니까? – biziclop

답변

1

"RES는"상주 세트 크기 - 당신은 그 과정을 위해 사용하고 본질적으로 물리적 메모리.

예를 들어서, 10 MiB를 사용하고 있다는 최상위 상태 - 약 5m의 -Xmx 설정에 대해 대략 예상 한 것입니다. (사용 된 총 실제 메모리는 종종 * nix에 대한 Java의 경험에서 두 배로 보입니다 .? 시스템

또한

에서, * 괜찬아 가상 메모리가 사용 가능한 메모리 공간을 포함하면 실제로 메모리 문제를 얻거나 당신에게 "최고"의 잘못된 출력에 대해 단지 우려하고 있습니까 -. 물리적 및 스왑의 경우 프로세스가 "스왑"을 사용하지 않으면 실제 "상주"메모리 만 사용합니다.

Stack Overflow answer to why JVM uses more memory than just heap setting.

+0

위의 @biziclop 대답에 설명되어 있습니다 : OOM 킬러 및 거대한 디스크 공간 사용을 피하려고합니다. – dfrankow

+0

당신은 * nix 가상 메모리가 스왑이 아닌 완전한 메모리 공간이라는 것을 알고 있습니다. Windows '가상 "스왑"메모리와 달리. – Mikaveli

+0

@Mikaveli : 나는 몰랐다! 나는 이것이 나에게 비 - 문제라고 생각한다. – dfrankow

0

-Xms를 사용하여 최소 메모리를 지정해보십시오.

+0

"java -Xms5m -Xmx5m SleepTest"는 여전히 150M의 가상 메모리를 사용합니다. – dfrankow

0

JVM은 힙 공간 (모든 메모리 사용량)에 대해 몇 가지 기본값을 취합니다. 이 기본값은 컴퓨터 특성 (RAM, 코어 등) 및 JVM 구현 (Sun/Oracle, OpenJDK)에서 비롯됩니다.

-Xmx5m이 너무 낮고 JVM이이 매개 변수를 자동으로 무시한다고 생각합니다. 여기

는 읽을 수있는 링크의 많은 좋은 참조가 :

Java Memory explained (SUN JVM)

+0

"-Xmx5m이 너무 낮습니다"- 인수 위치가 잘못 배치되었거나 SleepTest 앞에 있어야합니다. – bestsss

+0

arg 배치를 수정했습니다. – dfrankow

1

$ java -cp. SleepTest -Xmx5m

와우! -Xmx5m은 public static void main(String[] a)에서 찾을 수있는 인수입니다. 그것은 아니 VM

이동에 자바 프로그램에 대한 매개 변수입니다 그것은 첫째 $ java -Xmx5m -cp . SleepTest

+0

예, 발견하고 수정했습니다. 여전히 150M 가상 메모리 사용. – dfrankow

+0

얼마나 원하십니까? 가상 메모리가 뭔지 알아? – bestsss

+0

좋은 지적! 나는 항상 가상 메모리가 스왑을 사용한다고 생각했지만, 그렇지 않은 것으로 보입니다. – dfrankow