windows|window虚拟内存

先公布结论

  • 当我们在任务管理器看到内存还有剩余,但是程序无法申请报OOM的时候,可能是虚拟内存不够用,占用了物理内存,而这一部分内存在任务管理器中认为是未使用的。可以通过资源管理器 右侧视图的内存使用来判断
  • 任务管理器显示的是上面的使用的物理内存,而内存实际使用为下图的内存使用,可以通过systeminfo查看具体使用情况
    windows|window虚拟内存
    文章图片
在开启了多个中间件,和应用程序以后,软件成功地跑不起来了
  1. 物理内存16G,系统的虚拟内存没有设置过 ,经过我的多次对比得到systeminfo中获取到的 虚拟内存最大值=虚拟内存+物理内存
  2. 系统默认给我开启了10G的虚拟内存,在c盘根目录下
  3. 该状态在物理内存还剩余 2G ,虚拟内存160M 但是系统已经无法给我新的java虚拟机分配内存了?
  4. windows|window虚拟内存
    文章图片
windows资源监视器
windows|window虚拟内存
文章图片

  1. 在资源管理器内存用量仍然剩余3g的情况下,我看到了如上的资源监视器
  2. 内存空间主要是正在使用的11G资源,以及3G的备用内存
  3. 可以看到备用的解释为 未活跃使用的缓存数据和代码的内存
  4. windows内存设计的思想是"没用使用内存都是浪费",所以吧剩余没有利用起来的内存直接用作缓存加速
    5. 在新进程启动的过程中会亚索备用区的大小,我目前在该状态下启动xmx=2g的java程序失败,不清楚是否是因为程序实际占用空间大于该备用空间导致。
  5. 只需要参考内存使用情况是否100% ,如果此时物理内存未满,可以增加虚拟内存大小
  6. 在上半部分的进程中,根据比对感觉工作集大小应该是物理内存使用情况,已提交内存大小为物理内存+虚拟内存的总大小
  7. 根据进程id,结合jconsole对比,可以更好地感受实际java程序的内存使用情况
测试数据 第一次测试的时候 虚拟可用内存和虚拟已用内部才能标反了… 【windows|window虚拟内存】windows|window虚拟内存
文章图片

  • 上述数据均通过systeminfo统计获取,测试方式为分为两次
    • 第一次使用虚拟内存配置为10-20G
    • 第二次未开启虚拟内存
    • 然后逐次启动应用,观察内存占用情况的大小
  • 特殊现象
    1. 第二次测试中,标红色的物理内存异常下降,原因未知
    2. 第二次测试最后一次测试,剩余虚拟内存空间 300M 此时继续启动程序,会出现内存不足的异常
    3. 第二次测试中 物理内存大小与虚拟内存大小总量保持一致,但是已用内存不一致
    4. 第一次测试倒数第二次测试,可用虚拟内存不足的情况下继续开启应用,此时配置的最小虚拟内存大小会扩增
  • 结论
    1. 未开启足够虚拟内存的情况下,资源管理器统计的物理内存不足以实际反映出内部才能占用情况 ,此时参考虚拟内存即可
    2. 两种情况下,应用占用的总内存基本保持一致(第一种情况为物理+虚拟 第二种情况 只参考虚拟内存)
    3. 如果虚拟内存已达到上限,物理内存富余,会将虚拟内存数据写到物理内存中去,且资源管理器(只反映物理内存)无法反应这部分虚拟内存,
      可以通过资源监视器中的内存使用情况
      ps:推测
      1. 如果物理内存先不足可能会爆出内存溢出,也可能将物理内存中的数据写入虚拟内存中去
        (问题在于物理内存数据是否可以写入虚拟内存,确认虚拟内存数据可以写入物理内存)
第二张资源监视器,物理内存未满,内存使用已经100%,在最后测试以前没有注意到这个情况

    推荐阅读