2009-06-19 95 views
4

調整使用本機C++庫的使用Java編寫的服務器應用程序的最佳方式是什麼?使用本機進程的Java內存使用情況

該環境是一個32位Windows機器,具有4GB的RAM。 JDK是Sun 1.5.0_12。

在啓動時,Java進程獲得1024MB內存(-Xmx),但由於缺少堆空間,我經常看到OutOfMemoryErrors。如果內存增加到1200MB,則由於缺少交換空間而發生OutOfMemoryErrors。內存在JVM和本地進程之間如何共享?

Windows/3GB切換器對本機進程和Sun JVM有任何影響嗎?

回答

2

我在設置(32位系統上的Java - msw和其他)上遇到了很多麻煩,它們都是通過在JVM的* 1GB內存下保留*來解決的。

否則,如上所述,系統中該進程的實際佔用內存將超過2GB;在那個時候,我正在「沉默地死亡」的過程 - 沒有錯誤,沒有任何警告,只是這個過程非常安靜地終止。

我在同一個系統上運行多個JVM(每個JVM都不到1GB RAM),我獲得了更高的穩定性和性能。

0

在JVM和本機進程之間共享內存如何?

Sun的JVM的垃圾收集器是標記和掃描的,具有啓用併發GC和增量GC的選項。

嗯,更準確地說,它是上演的,而上述只適用於終身(長壽命)的對象。對於年輕的對象,GC仍然使用停止和複製收集器,這對於處理短暫對象(並且所有典型的Java程序創建許多短暫對象)來說都更好。

複製收集器遍歷堆中的所有元素,如果它們被引用則將它們複製到新堆中,然後丟棄前一堆。因此1M個實時對象需要高達2M的實際內存:如果每個對象都處於活動狀態,則在垃圾收集期間將會有兩個副本。

因此,JVM需要比VM內運行的代碼多得多的系統內存,因爲管理和垃圾回收會有相當大的開銷。

Windows/3GB交換機對本機進程和Sun JVM有任何影響嗎?

/3GB的允許用戶虛擬存儲器地址空間是3GB,但僅用於可執行文件,其頭標有IMAGE_FILE_LARGE_ADDRESS_AWARE。據我所知,Sun的java.exe不是。我沒有Windows系統,所以我無法驗證。

1

我在JNI memory management here上找到了一些信息,這裏是JVM JNI section on memory management

在2GB的用戶空間上擁有3GB的用戶空間應該會有所幫助,但是如果您在2GB的交換空間時出現問題,我認爲3GB會讓情況變得更糟。你的頁面文件有多大?它最終出來了嗎?

通過將jconsole連接到您的jvm,您可以更好地瞭解您的堆分配情況。

0

不幸的是,您還沒有很好地解釋您的問題。真正的問題是---爲什麼Java過程增長如此之多。你有內存泄漏嗎?你有沒有真正的理由在JVM中擁有那麼多的數據?

C++庫是從C堆棧中分配自己的內存,還是從Java對象空間分配內存,還是完全在做其他事情?