为什么即使有大约 700Mb 的空闲 RAM,我也会收到 System.OutOfMemoryException?

2024-01-13

我正在运行一些测试,看看我的日志记录将如何执行而不是执行File.AppendAllText我会首先写入内存流,然后复制到文件。所以,只是为了看看内存操作有多快,我这样做了..

private void button1_Click(object sender, EventArgs e)
    {
        using (var memFile = new System.IO.MemoryStream())
        {
            using (var bw = new System.IO.BinaryWriter(memFile))
            {
                for (int i = 0; i < Int32.MaxValue; i++)
                {
                    bw.Write(i.ToString() + Environment.NewLine);
                }
                bw.Flush();
            }
            memFile.CopyTo(new System.IO.FileStream(System.IO.Path.Combine("C", "memWriteWithBinaryTest.log"), System.IO.FileMode.OpenOrCreate));
        }
    }

When i到达25413324我有一个Exception of type 'System.OutOfMemoryException' was thrown.即使我的流程浏览器 http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx说我有大约 700Mb 的可用内存???

这是屏幕截图(以防万一)

Process Explorer enter image description here

这是winform

EDIT :为了在堆上创建更多对象,我重写了bw.write to this

bw.Write(i);

首先,你会耗尽内存,因为你在MemoryStream,而不是直接将其写入FileStream。使用FileStream直接,你根本不需要太多内存(但你必须保持文件打开)。

未使用的物理内存量与此异常没有直接关系,这听起来很奇怪。

重要的是:

  • 进程中有一块连续的可用内存'虚拟地址空间
  • 系统提交不超过总 RAM 大小 + 页面文件大小

当您要求 Windows 内存管理器为您分配一些 RAM 时,它需要检查的不是多少可用的,但是它有多少promised供所有其他进程使用。这种承诺是通过提交来完成的。到commit一些内存意味着内存管理器向您保证它will当您最终使用它时即可使用。

因此,物理 RAM 可能已完全用完,但您的分配请求仍然成功。为什么?因为页面文件中有大量可用空间。当您实际开始使用通过此类分配获得的 RAM 时,内存管理器只会简单地调出其他内容。因此 0 物理 RAM != 分配将会失败。

相反的情况也可能发生。尽管有一些未使用的物理 RAM,分配也可能会失败。你的进程通过所谓的虚拟地址空间。当您的进程读取地址处的内存时0x12340000,这是一个虚拟地址。它可能映射到 RAM0x78650000, or at 0x000000AB12340000(在 64 位操作系统上运行 32 位进程),它可能指向仅存在于页面文件中的内容,或者甚至可能根本不指向任何内容。

当您想要分配具有连续地址的内存块时,RAM 需要在该虚拟地址空间中是连续的。对于 32 位进程,您只能获得 2GB 或 3GB 的可用地址空间,因此以不存在足够大小的连续块的方式使用它并不太难,尽管有可用的物理 RAM 和足够的内存未使用的虚拟地址空间总量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么即使有大约 700Mb 的空闲 RAM,我也会收到 System.OutOfMemoryException? 的相关文章

随机推荐

  • Node.JS 内核模式线程

    我试图弄清楚 Node JS 其 Windows 版本 是如何在幕后工作的 我知道有用户模式和内核模式线程 并且我知道处理模型如下所示 我还知道从内核模式线程移动到用户模式线程被认为是上下文切换 Node JS C 非阻塞工作线程是内核模式
  • Angular2 在模板和变更检测中的功能

    我试图在服务中构建一种方法 检查是否应根据当前用户的权限向当前用户显示导航按钮 我知道这只是装饰性的 安全性 因此这是放置在模板内的按钮
  • 尾随返回类型中的占位符是否会覆盖初始占位符?

    g 似乎接受任意组合auto and decltype auto 作为初始和尾随返回类型 int a auto f return a int auto g gt auto return a int auto h gt decltype au
  • 关于 DSO 引用隐藏符号的警告究竟意味着什么?

    我在将某些共享库与 g 链接时遇到问题 它给了我这样的警告 hidden symbol XXX in YYY is referenced by DSO usr lib 我已经阅读了一些有关特定问题的相关问题 但我想从整体上理解它 这个警告是
  • 如何授予jnlp文件中依赖lib的所有权限?

    我在使用 Java Web Start 时遇到了一个严重的问题 我无法理解 情况如下 我有一个 JavaFX 应用程序 编写为 Java8 我想使用 Java WebStart 进行部署 直到最近 我还使用 HTTP 与服务器进行通信 一切
  • 仅在 Spring Data Rest 中为子资源级别启用存储库?

    我有 2 个 jpa 实体 Document 和 DispatchDetail 它们具有一对多关系 即一个文档可以有一个dispatchDetails 列表 我为每个实体创建了 2 个存储库 现在我要尝试文档 GET http localh
  • Django MakeMessages 在 Windows 中缺少 xgettext

    在 Windows 7 上运行 Django 我目前正在尝试使用 django 书籍第 19 章中的说明翻译几个 Django 模板 我已向模板添加了翻译标签 加载了 I18N 并修改了 django 设置 然后我运行 django adm
  • 快速地,为什么当协议有初始化器时我不能实例化它?

    据我所知 通常我无法实例化协议 但是 如果我在协议中包含一个初始化程序 那么编译器肯定知道当结构或类稍后使用该协议时 它将有一个可以使用的 init 吗 我的代码如下所示 protocol Solution var answer Strin
  • 无法连接到服务器:net/http:TLS 握手超时

    在 minikube for windows 上 我在 kubernetes 集群上创建了一个部署 然后尝试通过将副本从 1 更改为 2 来扩展它 之后 kubectl 挂起 我的磁盘使用率为 100 我的部署中只有一个容器 apiVers
  • 单击按钮后立即执行 SwiftUI 按钮操作,而不是单击释放时

    我想在 SwiftUI Button 中单击 点击按钮后立即调用该操作 我怎样才能实现这个 这是一种可能的方法 使用自定义ButtonStyle注入自定义触地动作 使用 Xcode 12 iOS 14 进行测试 struct Pressed
  • com.sun.ws.rs.ext.RuntimeDelegateImpl 错误

    请帮忙 目前我正在构建一个系统 允许一些Web服务 Axis2 调用restful jersey 1 12 场景是这样的 客户端 gt webservice Axis2 gt Restful services Jersey 1 12 在 t
  • 如何使用 SqlCommand 创建带有参数化数据库名称的数据库?

    简而言之 我有两个简单的助手 private SqlCommand CreateCommand string text SqlCommand cmd new SqlCommand cmd Connection connection cmd
  • Tinymce 4.x 扩展插件

    我正在寻找一些有关如何扩展现有的tinymce 4 x 插件的示例 例如 链接 插件 链接插件打开一个对话框窗口 我想做的是在对话框打开时添加一个事件并修改正文 插入一些带有单击事件的额外 HTML 做得好似乎是有问题的 我想避免一些 顶部
  • 生成两个相关的随机向量

    我想生成两个具有指定相关性的随机向量 第二个向量的每个元素必须与第一个向量的相应元素相关并且相互独立 我怎样才能在 MATLAB 中做到这一点 顺便说一句 第一个向量的元素不具有相同的分布 我的意思是第一个向量的每个元素应该具有不同的方差
  • Py_Finalize() 会导致 Python 3.9 出现分段错误,但不会导致 Python 2.7

    我正在开发一个使用 C matplotlib 包装器的项目matplotlibcpp h https github com lava matplotlib cpp 使用这个原始头文件的最小示例是 include matplotlibcpp
  • 如何为 Android 制作自定义地点选择器

    据我所知 谷歌不允许开发人员自定义地点选择器布局 所以我想制作一个如下图所示的地点选择器 它来自 Deliveroo 应用程序 我使用了地图 api 但它并不完全像这张照片 这个选择器的行为类似于地点选择器 api 它是定制的 这是我的代码
  • PHP Twitter API 搜索/推文 仅获取上一小时的推文

    您好 我一直在互联网上查找 但尚未找到解决方案 我只想获取过去一小时内具有特定主题标签的推文 我正在使用该主题标签提取推文 但我不知道如何只获取过去一小时的推文 这是一些示例数据 正如您所看到的 那里有一个created at日期 但我不知
  • ggplot2箱线图中的标签框

    我希望在由生成的箱线图中每个框上方显示一个标签ggplot2 例如 Example data test c A A A A A A B B B B B B patient c 1 1 2 2 3 3 1 1 2 2 3 3 result c
  • iOS8 的 Xcode 6 中的 OES OpenGL 语句显示错误

    Yosemite 中的 Xcode 6 iOS SDK 8 0 给出了 OpenGL ES2 代码的错误 该代码在 Xcode 5 下可以正常编译 GLuint depthStencilRenderbuffer glBindRenderbu
  • 为什么即使有大约 700Mb 的空闲 RAM,我也会收到 System.OutOfMemoryException?

    我正在运行一些测试 看看我的日志记录将如何执行而不是执行File AppendAllText我会首先写入内存流 然后复制到文件 所以 只是为了看看内存操作有多快 我这样做了 private void button1 Click object