很多人認為Xmx和-Xms參數指定的就是Java程序將會占用的內存,但是這實際上只是Java堆對象將會占用的內存。堆只是影響Java程序占用內存數量的一個因素。
除了堆,影響Java程序所占用內存的因素還包括:棧、永生代、JVM本身、NIO中的DirectBuffer等。
假設Xmx為1024m,MaxPermSize為256m,Xss為512k,有100個線程。考慮到socket緩沖區、JNI等,一般大約是jvm內存的5%左右。
則Java程序占用的最大內存可能為:1024m + 256m + 100*512k + (0.05 * 1330m) = 1396.5m
DirectBuffer占用的空間是不包含在JVM的空間中的,如果使用了DirectBuffer,除了JVM還需要監控DirectBuffer占用的空間大小,為操作系統留下足夠的內存。