為什么Java程序占用的內存比實際分配給它的要多

openkk 12年前發布 | 14K 次閱讀 Java
很多人錯誤的認為運行Java程序時使用-Xmx和-Xms參數指定的就是程序將會占用的內存,但是這實際上只是Java堆對象將會占用的內存。堆只是影響Java程序占用內存數量的一個因素。要更好的理解你的Java程序將會占用多大的內存需要先了解有哪些因素會影響到內存的占用。這些因素包括:
  • 對象(Objects)
  • 類(Classes)
  • 線程(Theads)
  • 本地數據結構(Native data structures)
  • 本地代碼(Native code)
每個因素對內存占用的影響又會隨著應用程序、運行環境和系統平臺的不同而變化,那怎樣計算總的內存占用量?是的,想得到一個準確的數字不是那么容易,因為你很難控制本地(Native)部分。你能控制的部分只有堆大小:-Xmx,類占用的內存:-XX:MaxPermSize,還有線程棧:-Xss控制每個線程占用的內存。注意當把棧大小設置的太小時會導致StackOverflow異常、程序出錯。所以,計算公式為:
(-Xmx) + (-XX:MaxPermSize) + 線程數 * (-Xss) + 其它內存

其它內存部分取決于本地代碼占用的內存,如NIO、socket緩沖區、JNI等。它一般大約是jvm內存的5%左右。所以假設我們有下面的JVM參數和100個線程:
-Xmx1024m -XX:MaxPermSize=256m -Xss512k 
那么jvm進程至少會占用內存數量為:1024m + 256m + 100*512k + (0.05 * 1330m) = 1396.5m

我一般使用(1.5 * 堆最大值)來作為一個近似值表示一個tomcat進程會需要的最小內存,如果你有需要增加MaxPermSize到256M以上的應用這個值可以更大些。如果你使用這個來衡量你的系統將會占用多少內存要記住你需要為系統和其它運行在系統上的程序留下足夠的內存,否則會導致系統使用過多的虛擬內存,這樣會降低性能。

OSHINA原創翻譯 ,  原文鏈接
 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!