内存探险
在开启了多个中间件,和应用程序以后,软件成功地跑不起来了
- 物理内存16G,系统的虚拟内存没有设置过 ,经过我的多次对比得到systeminfo中获取到的 虚拟内存最大值=虚拟内存+物理内存
- 系统默认给我开启了10G的虚拟内存,在c盘根目录下
- 该状态在物理内存还剩余 2G ,虚拟内存160M 但是系统已经无法给我新的java虚拟机分配内存了?
windows资源监视器
- 在资源管理器内存用量仍然剩余3g的情况下,我看到了如上的资源监视器
- 内存空间主要是正在使用的11G资源,以及3G的备用内存
- 可以看到备用的解释为 未活跃使用的缓存数据和代码的内存
- windows内存设计的思想是"没用使用内存都是浪费",所以吧剩余没有利用起来的内存直接用作缓存加速
5. 在新进程启动的过程中会亚索备用区的大小,我目前在该状态下启动xmx=2g的java程序失败,不清楚是否是因为程序实际占用空间大于该备用空间导致。 - 只需要参考内存使用情况是否100% ,如果此时物理内存未满,可以增加虚拟内存大小
- 在上半部分的进程中,根据比对感觉工作集大小应该是物理内存使用情况,已提交内存大小为物理内存+虚拟内存的总大小
- 根据进程id,结合jconsole对比,可以更好地感受实际java程序的内存使用情况
测试数据
第一次测试的时候 虚拟可用内存和虚拟已用内部才能标反了…
-
上述数据均通过systeminfo统计获取,测试方式为分为两次
- 第一次使用虚拟内存配置为10-20G
- 第二次未开启虚拟内存
- 然后逐次启动应用,观察内存占用情况的大小
-
特殊现象
- 第二次测试中,标红色的物理内存异常下降,原因未知
- 第二次测试最后一次测试,剩余虚拟内存空间 300M 此时继续启动程序,会出现内存不足的异常
- 第二次测试中 物理内存大小与虚拟内存大小总量保持一致,但是已用内存不一致
- 第一次测试倒数第二次测试,可用虚拟内存不足的情况下继续开启应用,此时配置的最小虚拟内存大小会扩增
-
结论
- 未开启虚拟内存的情况下,资源管理器统计的物理内存不足以实际反映出内部才能占用情况 ,此时参考虚拟内存即可
- 两种情况下,应用占用的总内存基本保持一致(第一种情况为物理+虚拟 第二种情况 只参考虚拟内存)
- 如果虚拟内存已达到上限,物理内存富余,会将虚拟内存数据写到物理内存中去,且资源管理器(只反映物理内存)无法反应这部分虚拟内存,
可以通过资源监视器中的内存使用情况
ps:推测- 如果物理内存先不足可能会爆出内存溢出,也可能将物理内存中的数据写入虚拟内存中去
(问题在于物理内存数据是否可以写入虚拟内存,确认虚拟内存数据可以写入物理内存)
- 如果物理内存先不足可能会爆出内存溢出,也可能将物理内存中的数据写入虚拟内存中去