【问题标题】:Does closing a handle on a file release the associated memory in Windows?关闭文件的句柄是否会释放 Windows 中的关联内存?
【发布时间】:2015-06-04 19:48:43
【问题描述】:

我正在分析一个产品在 Windows 平台上的性能。使用 CloseHandle() 函数关闭该文件的句柄是否会将内容刷新到磁盘并将其从 RAM 中删除? Windows 平台:Windows Server 2008 R2 作为虚拟机

编辑:我正在分析一个数据库产品。我们看到 RAM 使用量突然减少。我浏览了 CloseHandle 的 MSDN 并看到一行写着“对象的最后一个句柄关闭后,该对象将从系统中删除。”这个词 system 这里不清楚。在关闭最后一个句柄之前,我们已经在使用 FlushFileBuffers() 来持久化数据。 由于数据库文件可能很大,FlushFileBuffers() 会导致大量磁盘 I/O。将 Windows Server 用作 VM 会降低磁盘 I/O 的性能吗?

【问题讨论】:

  • 不,写回磁盘是惰性的。不要乱用它,使用 FlushFileBuffers() 不是一个好主意。

标签: windows winapi file-io operating-system virtual-machine


【解决方案1】:

关闭句柄不会(可靠地)刷新未写入的数据,也不会(通常)清除缓存的数据。这样做意味着实际上将有零缓存和延迟回写的好处。

我观察到 Windows 急切地刷新和取消缓存文件,但这更像是一个例外而不是规则。

【讨论】:

  • 文件的最后一个句柄也一样吗?
  • 是的。大多数缓存文件都打开了零句柄。使用 RAMMap 查看文件缓存内容。
【解决方案2】:

避免调用 FlushFileBuffers(),因为这会降低系统性能,并且不能保证写入的持久性。

CloseHandle() 适用于所有类型的句柄,而不仅仅是文件句柄。例如 CreateEvent() 返回一个句柄。文档将这些类型的“对象”称为“从系统中删除”。文件,除非它们被标记为关闭时删除,否则在关闭后(显然)将保留在文件系统中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多