Java虛擬機支持的最大內存限制


最近在開發Java的程序。本來我是一直很喜歡Java的內存管理的,不需要擔心分配內存,只管分配,垃圾收集器自己會給你回收內存的。現在開發的程序數據量很大,為了速度快,我准備把所有的信息加載進內存,這樣可以保證快速響應。我還在反復算內存,想想自己的數據量,現在剛開始的時候應該夠了(我的機器是4G內存,雖然Windows就認3.5G,但是比起我現在的數據量應該沒問題)。

  沒想到第一個實驗的程序,跑了幾個小時,就遇到了Out of Memory Exception了。看看自己的虛擬機設置,我設置的是-Xms512M -Xmx1024M。想都沒想,直接改成-Xms512M -Xmx2048M,結果直接就Could not reserve enough space for object heap。程序都起不來了。這才發現原來最大內存還有限制。上網搜了一下,發現很多討論這個問題的文章。最終在BEA的DEV2DEV論壇發現了最有用的 一篇

  這里的版主YuLimin 做了測試,得出結論:

  公司 JVM版本                  最大內存(兆)client    最大內存(兆)server

  SUN 1.5.x                          1492                            1520

  SUN 1.5.5(Linux)             2634                            2660

  SUN 1.4.2                          1564                            1564

  SUN 1.4.2(Linux)             1900                            1260

  IBM 1.4.2(Linux)             2047                             N/A

  BEA JRockit 1.5 (U3)      1909                             1902

  我現在用的是JDK1.6. 0_05,測試了一下。在Client狀態下最大是,我的JDK不認-Server參數,測試不了Server狀態。估計差不多。

  SUN 1.6.0                          1442                           N/a

  看樣子用Java想用大內存也是不可能的了。而且一般的說法是內存太大了,垃圾收集的時間就會長。這也可以理解,一般是內存不夠用了才收集的,掃描2G內存比1G當然要慢多了,而且內存對象多了,估計關系是指數上升的。

  下面附上YuLimin的測試方法和測試記錄。

  測試方法:在命令行下用 java -XmxXXXXM -version 命令來進行測試,然后逐漸的增大XXXX的值,如果執行正常就表示指定的內存大小可用,否則會打印錯誤信息。

 

 

  • 堆(Heap)和非堆(Non-heap)內存
    按照官方的說法:“Java 虛擬機具有一個堆,堆是運行時數據區域,所有類實例和數組的內存均從此處分配。堆是在 Java 虛擬機啟動時創建的。”“在JVM中堆之外的內存稱為非堆內存(Non-heap memory)”。可以看出JVM主要管理兩種類型的內存:堆和非堆。簡單來說堆就是Java代碼可及的內存,是留給開發人員使用的;非堆就是JVM留給 自己用的,所以方法區、JVM內部處理或優化所需的內存(如JIT編譯后的代碼緩存)、每個類結構(如運行時常數池、字段和方法數據)以及方法和構造方法 的代碼都在非堆內存中。
  • 堆內存分配
    JVM初始分配的內存由-Xms指定,默認是物理內存的1/64;JVM最大分配的內存由 -Xmx指定,默認是物理內存的1/4。默認空余堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內存大於70%時,JVM會減少堆 直到-Xms的最小限制。因此服務器一般設置-Xms、-Xmx相等以避免在每次GC 后調整堆的大小。
  • 非堆內存分配
    JVM使用-XX:PermSize設置非堆內存初始值,默認是物理內存的1/64;由XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。
  • JVM內存限制(最大值)
    首先JVM內存限制於實際的最大物理內存(廢話!呵呵),假設物理內存無限 大的話,JVM內存的最大值跟操作系統有很大的關系。簡單的說就32位處理器雖然可控內存空間有4GB,但是具體的操作系統會給一個限制,這個限制一般是 2GB-3GB(一般來說Windows系統下為1.5G-2G,Linux系統下為2G-3G),而64bit以上的處理器就不會有限制了。

     

    所以說設置VM參數導致程序無法啟動主要有以下幾種原因:

    1) 參數中-Xms的值大於-Xmx,或者-XX:PermSize的值大於-XX:MaxPermSize;

    2) -Xmx的值和-XX:MaxPermSize的總和超過了JVM內存的最大限制,比如當前操作系統最大內存限制,或者實際的物理內存等等。說到實際物理 內存這里需要說明一點的是,如果你的內存是1024MB,但實際系統中用到的並不可能是1024MB,因為有一部分被硬件占用了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM