-Xms 和 -Xmx 不能設置的太大


  之前我一直有一個疑問,就是-Xms 和 -Xmx不是設置的越大越好嗎?現在才明白怎么回事。

  通過在命令行中執行 java 或者啟動某種基於 Java 的中間件來運行 Java 應用程序時,Java 運行時會創建一個操作系統進程,就像您運行基於 C 的程序時那樣。實際上,大多數 JVM 都是用 C 或者 C++ 語言編寫的。作為操作系統進程,Java 運行時面臨着與其他進程完全相同的內存限制:架構提供的尋址能力以及操作系統提供的用戶空間。

  架構提供的內存尋址能力依賴於處理器的位數,舉例來說,32 位或者 64 位,對於大型機來說,還有 31 位。進程能夠處理的位數決定了處理器能尋址的內存范圍:32 位提供了 2^32 的可尋址范圍,也就是 4,294,967,296 位,或者說 4GB。而 64 位處理器的可尋址范圍明顯增大:2^64,也就是 18,446,744,073,709,551,616,或者說 16 exabyte(百億億字節)。

  處理器架構提供的部分可尋址范圍由 OS 本身占用,提供給操作系統內核以及 C 運行時(對於使用 C 或者 C++ 編寫的 JVM 而言)。OS 和 C 運行時占用的內存數量取決於所用的 OS,但通常數量較大:Windows 默認占用的內存是 2GB。剩余的可尋址空間(用術語來表示就是用戶空間)就是可供運行的實際進程使用的內存。

  對於 Java 應用程序,用戶空間是 Java 進程占用的內存,實際上包含兩個池:Java 堆和本機(非 Java)堆。Java 堆的大小由 JVM 的 Java 堆設置控制:-Xms 和 -Xmx 分別設置最小和最大 Java 堆。在按照最大的大小設置分配了 Java 堆之后,剩下的用戶空間就是本機堆。圖 1 展示了一個 32 位 Java 進程的內存布局:

  

  可尋址范圍總共有 4GB,OS 和 C 運行時大約占用了其中的 1GB,Java 堆占用了將近 2GB,本機堆占用了其他部分。請注意,JVM 本身也要占用內存,就像 OS 內核和 C 運行時一樣,而 JVM 占用的內存是本機堆的子集。

  由此可見-Xms 和 -Xmx 設置的過大,那么JVM的內存將被搶占,其他應用程序也無法運行。

  不知道理解的對不對,請高手出來指點一二。

                                                                        作者   Young-Ken(微博)

                                                  審閱者 Cindy-Leee(微博)

轉載請注明 http://www.cnblogs.com/youngKen/p/4910410.html

 


免責聲明!

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



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