【问题标题】:How are Virtual Bytes allocated?虚拟字节是如何分配的?
【发布时间】:2021-05-16 15:00:53
【问题描述】:
  • 在 Windows 用户模式进程开始时,是什么决定了其 Virtual Address Space 的初始大小?

  • 是什么导致虚拟字节在进程的生命周期内波动?

根据Microsoft docs

进程可用的虚拟地址空间总量受限于物理内存和磁盘上可用于分页文件的可用空间。

  • 这是否意味着如果可用磁盘空间减少,Virtual Bytes 可以down
  • 它会因为有更多可用磁盘空间而上升吗?

背景

我的一个在共享托管平台上运行的 ASP.NET Webforms 网站开始失败,出现 503 错误。添加一些诊断后,我看到该应用程序非常频繁地重新启动(在繁忙时间每分钟),直到它最终死掉(503)。

进一步调试表明,该应用以大约 1.2-1.5 Gb 的 Process.VirtualMemorySize64 开头。托管服务提供商在 IIS 应用程序池设置中将虚拟内存限制设置为 1.5 Gb。难怪这个过程会在几分钟内被击落。

这让我想到了上面的问题。

【问题讨论】:

标签: windows iis memory


【解决方案1】:

在 Windows 用户模式进程开始时,由什么决定其虚拟地址空间的初始大小?

PE32 可执行文件中的部分具有虚拟内存大小。

是什么导致虚拟字节在进程的生命周期内波动?

内存分配;即当你 new[] 某事时会发生什么(如果你熟悉 libc,malloc 在幕后做了什么。如果你来自 Linux 背景,Windows 相当于 sbrk)。

进程可以使用系统调用来分配更多的虚拟内存;在现代系统上,不会自动保留内存。它只是使地址对进程有效,但是对未保留页面的第一次访问将(对进程透明)失败,引发 NT 内核处理的异常,然后实际上占用一些内存并将其添加到页表中对于那个地址(范围)。

这是否意味着如果可用磁盘空间减少,虚拟字节可以减少? 它会因为有更多可用磁盘空间而上升吗?

没有。虚拟内存是一个地址空间。该地址空间可以由实际 RAM 支持,它根本不能支持(即第一次尚未使用),或者它可以写入磁盘上的页面文件(“交换”),使用的 RAM 被标记为未使用,并且在下一次尝试访问该内存区域时,显然会失败,内核会将内存从磁盘加载到一些当前未使用的 RAM 页面,然后将其映射到有问题的虚拟地址。


您可能想重新审视虚拟内存、逻辑内存和物理内存地址的处理方式。


进一步调试表明,该应用以大约 1.2-1.5 Gb 的 Process.VirtualMemorySize64 开始。

"b" 代表比特,你的意思可能是"GB",千兆字节;无论如何,这确实是您的运行时预先分配的大量内存。生活中很少有事情会占用这么多内存。

托管服务提供商在 IIS 应用程序池设置中将虚拟内存限制设置为 1.5 Gb。难怪这个过程会在几分钟内被击落。

听起来很合理。除非您在流程中实际实施大型数据库、完整浏览器、3D 游戏或千用户聊天服务器,否则这实际上就足够了。

作为 Lex Li points out in their comment,您的内存使用情况值得怀疑。你可能想figure out where your memory usage stems from

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2011-03-08
    • 2012-04-22
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    相关资源
    最近更新 更多