2011-02-03 12 views
1

我試圖調試爲什麼在CentOS 5和Ubuntu 10.04上,打印Hello然後Thread.sleep(3600*1000)的程序在Linux下(使用OpenJDK和Sun JVM)使用〜404MB的虛擬內存服務器。 (分別是MediaTemple(dv)和(ve))。JMX與htop報告的Java內存

但更具體地說,當我使用VisualVM或JConsole進行連接時,我看到了合理的內存使用情況:820KM堆(GC後); 8.4MB PermGen;加載1136個類。

爲什麼這種差異?

純粹是使用那麼多內存運行的JVM嗎?我嘗試啓動兩個Hello應用程序,查看內存使用情況是否線性擴展,並且它的性能如下:

我開始使用了總共​​78MB的RAM。啓動一個hello應用程序會將內存使用量提高到376MB。啓動另一個hello應用程序會產生656MB的總內存使用量,所以內存似乎不能很好地共享。 (這些數字是不是虛擬內存

(這些具體的數字是與OpenJDK的,但使用Sun 6 JDK給人comprable,但略微更低的內存使用率)

代碼:

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

命令行:

java -Xmx32m -Xms32m Hello 

使用JMX:

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

感謝你的幫助,

Wiktor的

+0

澄清:RES的內存爲21MB(如預期),SHR內存爲8MB。兩者都合理(對於Java來說,-))。我的問題是,從我的總容量2GB中減去虛擬內存使用量,我需要運行~18個Java應用程序。 – wmacura 2011-02-03 23:50:09

+0

我嘗試使用`ulimit -v`來調整虛擬內存使用情況,但除非設置爲大約400,000(400MB),否則java應用程序無法成功啓動。 – wmacura 2011-02-03 23:54:22

回答

1

堆僅僅是Java使用內存的地區之一。

Section 3.5 in the Java Virtual Machine Specification Overview

PermGen的是另外一個,你可以指定Java的多少允許使用。

每個線程都有一個虛擬機堆棧,您還可以限制其大小。

有一個代碼緩存或方法區域來存儲編譯的代碼。

有可能是本地方法堆棧。內存映射文件或部分文件(如jar文件的索引)佔用進程的非堆內存區域的一部分。