2010-03-03 140 views
3

我無法理解Java內存使用情況。我有一個最大內存大小設置爲256M的應用程序。然而,在某些時候,我可以看到,根據任務管理器,它需要高達700MB!Java內存使用情況

不用說,應用程序的所有其餘的都有點反應遲鈍,當這種情況發生,因爲他們很可能換出。

它是WinXP上的JDK 1.6。有任何想法嗎 ?

回答

2

配置的內存可供應用程序使用。這將不包括

  • 本機庫加載

    1. JVM的大小
    2. 罐子/庫和相關的分配內存

    ,這將導致更大的圖像。需要注意的是,由於如何操作系統和JVM的工作,700MB可以在多個JVM之間共享(共享二進制圖像,共享庫等)

  • +0

    最終事實證明,當我在應用程序中使用JNA時,本機庫被指責。 – Demiurg 2010-05-07 08:30:02

    2

    你-Xmx指定的金額只爲用戶訪問堆 - 在創建運行時動態空間物體。

    Java進程將USEA更多的空間用於其自身的需求,包括JVM,程序和其他庫,常量池等

    另外,由於方式的垃圾收集系統的工作原理,有可能比當前堆中分配的內存更多 - 它還沒有被回收。

    之所以這麼說,你的程序設置爲256MB的最大堆真的lowballing它的現代化系統。對於繁重的程序,您通常可以請求至少1GB的堆。

    正如你提到的,緩慢的一個可能的原因是,一些分配給Java的內存被交換掉到磁盤。在這種情況下,程序確實會開始攪動磁盤,所以如果您的物理內存很少,請勿過度使用。在Linux上,你可以得到一個進程的頁面未命中狀態,我相信在windows上有類似的方法。

    0

    你指的是堆嗎?據我所知,有兩件事需要注意。 Xms選項設置初始java堆大小和Xmx​​選項設置最大Java堆空間。如果堆內存超過Xmx值,則應該有OutOfMemoryException。

    0

    如何處理虛擬頁面。我認爲Windows會向您顯示所有聚合的全部內容。

    1

    -Xmx選項僅限制java堆大小。除了堆以外,java還會爲其他內容分配內存,包括每個線程的堆棧(默認情況下爲2kB,由-Xss設置),PermGenSpace等。 因此,根據您啓動的線程數量,加載應用程序類以及其他一些因素,可能會使用比預期更多的內存。

    此外,作爲中指出,Windows任務管理器可以把虛擬內存的考慮。