我試圖調試爲什麼在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的
澄清:RES的內存爲21MB(如預期),SHR內存爲8MB。兩者都合理(對於Java來說,-))。我的問題是,從我的總容量2GB中減去虛擬內存使用量,我需要運行~18個Java應用程序。 – wmacura 2011-02-03 23:50:09
我嘗試使用`ulimit -v`來調整虛擬內存使用情況,但除非設置爲大約400,000(400MB),否則java應用程序無法成功啓動。 – wmacura 2011-02-03 23:54:22