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

#a'I!lO/WLPI$R0很多人错误的认为运行Java程序时使用-Xmx和-Xms参数指定的就是程序将会占用的内存,但是这实际上只是Java堆对象将会占用的内

存。堆只是影响Java程序占用内存数量的一个因素。要更好的理解你的Java程序将会占用多大的内存需要先了解有哪些因素会影响到内存的占用。这些因素

包括:0rM-Z.R^C1m~0

51Testing软件测试网z:Eak5kV

● 对象(Objects)1U

`V9|8p$r[,b0

#Rmt5R$X\0● 类(Classes)51Testing软件测试网e5T&iT%T!t/O v)y

51Testing软件测试网vW7L^9x y6d-RcU

● 线程(Theads)F*FWX*fV+ua {,a0

51Testing软件测试网Z:v.w"[7EhA'lR8h

● 本地数据结构(Native data structures)m0A_

F{Y,m0

yy0| n'vpP)B'Om0● 本地代码(Native code)t?v)MX-eJ1Y0

x.b\{:d]LJ2]0每个因素对内存占用的影响又会随着应用程序、运行环境和系统平台的不同而变化,那怎样计算总的内存占用量?是的,想得到一个准确的数字不是那么

容易,因为你很难控制本地(Native)部分。你能控制的部分只有堆大小:-Xmx,类占用的内存:-XX:MaxPermSize,还有线程

栈:-Xss控制每个线程占用的内存。注意当把栈大小设置的太小时会导致StackOverflow异常、程序出错。所以,计算公式为:51Testing软件测试网g2xB%V[dsG!k

51Testing软件测试网)fSEU"KF

(-Xmx) + (-XX:MaxPermSize) + 线程数 * (-Xss) + 其它内存L;O5YmT0

%|RLUM-^0f7]0其它内存部分取决于本地代码占用的内存,如NIO、socket缓冲区、JNI等。它一般大约是jvm内存的5%左右。所以假设我们有下面的JVM参数和100个线程:-Xmx1024m -XX:MaxPermSize=256m -Xss512k51Testing软件测试网J@$Yw&MY4?w

51Testing软件测试网0~ XuR|B1xDFE

那么jvm进程至少会占用内存数量为:1024m + 256m + 100*512k + (0.05 * 1330m) = 1396.5m51Testing软件测试网/NJZWT+]bt/Q'A

jd

51Testing软件测试网Ixz/GY$j1}C

我一般使用(1.5 * 堆最大值)来作为一个近似值表示一个tomcat进程会需要的最小内存,如果你有需要增加MaxPermSize到256M以上的应用这个值可以更大些。51Testing软件测试网$]R.Z'v1E2}

51Testing软件测试网7`:] b.d(k

如果你使用这个来衡量你的系统将会占用多少内存要记住你需要为系统和其它运行在系统上的程序留下足够的内存,否则会导致系统使用过多的虚拟内存,这样会降低性能。51Testing软件测试网XVD

Bn^C`g

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值