我以前跑tomcat的JVM一般都设2G的内存,但是最近我看了一下Solr的服务器,JVM给了6G,通过-Xms6000M -Xmx6000M设置的。而且有人建议只要服务器有内存,JVM的内存还可以再给。64位的JVM的内存是不是可以随便设?内存有多少一般怎么确定,有什么利弊?
闭关修行中......
分析了目前比較流行的幾個不同公司不同版本JVM的最大內存,得出來的結果如下:公司JVM版本最大內存(兆)client 最大內存(兆)serverSUN 1.5.x 1492 1520SUN 1.5 .5(Linux) 2634 2660SUN 1.4.2 1564 1564SUN 1.4.2(Linux) 1900 1260IBM 1.4.2(Linux) 1900 1260IBM 1.4.2(Lin?除非特別說明,否則JVM版本都運行在Windows作業系統下透過這個表想說明的是,如果你的機器的內存太多的話,只能透過多運行幾個實例來提供機器的利用率了,例如跑Tomcat,你可以多裝幾個Tomcat並做集群,依此類推。 堆(Heap)和非堆(Non-heap)記憶體依照官方的說法:「Java 虛擬機有一個堆,堆是運行時資料區域,所有類別實例和陣列的記憶體均從此處分配。堆是在Java虛擬機器啟動時所建立的。可以看出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記憶體的最大限制,例如目前作業系統最大記憶體限制,或是實際的實體記憶體等等。
1、具體根據每個應用的情況來,例如日均請求量、fullgc之後內存的大小均值等2、建議最大不超過操作系統內存的3/4
分析了目前比較流行的幾個不同公司不同版本JVM的最大內存,得出來的結果如下:
公司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) 1900 1260
IBM 1.4.2(Lin?除非特別說明,否則JVM版本都運行在Windows作業系統下
透過這個表想說明的是,如果你的機器的內存太多的話,只能透過多運行幾個實例來提供機器的利用率了,例如跑Tomcat,你可以多裝幾個Tomcat並做集群,依此類推。
堆(Heap)和非堆(Non-heap)記憶體依照官方的說法:「Java 虛擬機有一個堆,堆是運行時資料區域,所有類別實例和陣列的記憶體均從此處分配。堆是在Java虛擬機器啟動時所建立的。可以看出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記憶體的最大限制,例如目前作業系統最大記憶體限制,或是實際的實體記憶體等等。
1、具體根據每個應用的情況來,例如日均請求量、fullgc之後內存的大小均值等
2、建議最大不超過操作系統內存的3/4