【问题标题】:C++ App Exceeds Memory But Doesn't Use Virtual MemoryC++ 应用程序超出内存但不使用虚拟内存
【发布时间】:2010-08-10 17:36:37
【问题描述】:

我有一个应用程序使用“new”分配内存,并在代码的某些部分使用“delete”释放它们。 问题是每当它超过系统的内存限制(比如说 2GB)时,Windows 就会向进程发送一个 Kill 信号。 我认为这不常见,因为它应该使用交换空间(我认为在 Windows 中它被称为虚拟内存),对吧? 我的应用程序是用 C++/Visual Studio 编写的。

【问题讨论】:

  • AFAIK,32 位进程在 Windows 中不能使用超过 2GB。
  • 如果您需要超过 2GB 的空间,请使用 64 位版本的 windows 并将您的程序构建为 64 位目标。这是 32 位应用程序的限制。
  • 我的进程中没有使用 2GB 的 RAM。 Windows 已经使用了大约 1GB。我正在使用大约 1GB ......但总的来说它超过了内存。所以32位问题不是这样的。
  • 假设您的页面文件足够大,理论上您的进程最多可以分配 2GB,而不管安装或可用的 RAM 有多少。
  • 另外,是什么让您认为 Windows 没有使用其页面文件? (虚拟内存总是使用,与交换空间或页面文件不同)

标签: c++ windows visual-studio memory-management virtual-memory


【解决方案1】:

Here is how you can make it up to 3GB for a process;这是 32 位 Windows 应用程序的绝对最大值。除此之外,您将需要使用 64 位版本的 Windows。

那是很多内存。也许您可以考虑将您的应用拆分为多个进程并在它们之间进行通信。

【讨论】:

    【解决方案2】:

    操作系统不会杀死您的应用,而是会出现未处理的异常。您将需要使用 perfmon 检查您的应用程序,并观察这些计数器、工作集、虚拟字节、私有字节。当您的保留字节接近 2GB 时,您将遇到异常。所以你提交的字节数和 RAM 字节数要少得多。

    Here is a nice article on Virtual Address Space, including committed vs reserved.

    故事的寓意是,对于 32 位进程,不要尝试在保留字节接近 2GB 时进行分配。

    【讨论】:

      【解决方案3】:

      Windows 不使用信号。当内存不足时,您应该得到 std::badalloc 异常。哪个,当未被捕获时,将自动运行 terminate() 函数。异常在“输出”窗口中可见。

      【讨论】:

        【解决方案4】:

        我没有仔细研究过这个,但你可能会在这里找到你想要的答案:

        Can you allocate a very large single chunk of memory ( > 4GB ) in c or c++?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-12
          • 2013-10-21
          • 1970-01-01
          • 2011-03-19
          • 2012-02-21
          • 1970-01-01
          • 2014-12-16
          • 1970-01-01
          相关资源
          最近更新 更多