为什么Java程序占用的内存比实际分配的多

上一篇 / 下一篇  2012-08-23 10:46:38 / 个人分类:Java

6W/b;P4Zg2Yz-z0  很多人错误的认为运行Java程序时使用-Xmx和-Xms参数指定的就是程序将会占用的内存,但是这实际上只是Java堆对象将会占用的内 存。堆只是影响Java程序占用内存数量的一个因素。要更好的理解你的Java程序将会占用多大的内存需要先了解有哪些因素会影响到内存的占用。这些因素 包括:

p0\*S [~D:@0 51Testing软件测试网aLw @"M"W cb

  ● 对象(Objects)51Testing软件测试网c3L mA ` cPK?$|

G+HUE#p6{ g0  ● 类(Classes)

.b$e g*tE1I-[0

eR*Rm7[0  ● 线程(Theads)51Testing软件测试网2Xt m(LcEMe

51Testing软件测试网U.q-u|$Tf MUjmp%H

  ● 本地数据结构(Native data structures)51Testing软件测试网D3tQO~h+N&V

51Testing软件测试网M/kS F)O L-a,l

  ● 本地代码(Native code)51Testing软件测试网V!ISk8{9GV/z0]

C \n4z*|"I0  每个因素对内存占用的影响又会随着应用程序、运行环境和系统平台的不同而变化,那怎样计算总的内存占用量?是的,想得到一个准确的数字不是那么 容易,因为你很难控制本地(Native)部分。你能控制的部分只有堆大小:-Xmx,类占用的内存:-XX:MaxPermSize,还有线程 栈:-Xss控制每个线程占用的内存。注意当把栈大小设置的太小时会导致StackOverflow异常、程序出错。所以,计算公式为:

)tT/A pS0

(Y9?9PJ0[0[2t/{0  (-Xmx) + (-XX:MaxPermSize) + 线程数 * (-Xss) + 其它内存51Testing软件测试网2m!^v9Q C6vA)Y

X&g1~-J)T$T zfq0  其它内存部分取决于本地代码占用的内存,如NIO、socket缓冲区、JNI等。它一般大约是jvm内存的5%左右。所以假设我们有下面的JVM参数和100个线程:-Xmx1024m -XX:MaxPermSize=256m -Xss512k51Testing软件测试网P0?"E0K_.WFp O

51Testing软件测试网4q0^(\-~mXz,nv

  那么jvm进程至少会占用内存数量为:1024m + 256m + 100*512k + (0.05 * 1330m) = 1396.5m

4]5nLJ ?2@&C-_$ei0

T_ i-d?7P$ew*N.J7SK0  我一般使用(1.5 * 堆最大值)来作为一个近似值表示一个tomcat进程会需要的最小内存,如果你有需要增加MaxPermSize到256M以上的应用这个值可以更大些。51Testing软件测试网:kn `'Wr3T

#PU[!c@0  如果你使用这个来衡量你的系统将会占用多少内存要记住你需要为系统和其它运行在系统上的程序留下足够的内存,否则会导致系统使用过多的虚拟内存,这样会降低性能。51Testing软件测试网$UK_;aK/}4d5\


TAG:

 

评分:0

我来说两句

Open Toolbar