【问题标题】:Record and restore application state for quick .NET app startup记录和恢复应用程序状态以快速启动 .NET 应用程序
【发布时间】:2023-03-15 16:41:02
【问题描述】:

我正在使用一个需要很长时间才能启动和初始化的开源 .NET 应用程序。它创建了数千个对象并将它们配置为首次使用。我正在努力改善这个启动时间。

有没有办法使用 Windows API 或类似方法捕获应用程序内存,然后在重新启动 PC 后快速“恢复”此状态?本质上是否有一种方法可以访问和保存 .NET 应用程序的底层内存并让 CLR 在以后“吸收”这些内存?

  • 最简单的方法是使用 Windows Hibernate 创建“hiberfile.sys”,然后保存该文件的副本(如果可能的话)。每次windows启动时,你都会用保存的“干净”版本覆盖现有的hiberfile,以便下次启动。这确保您可以保存/恢复应用程序状态,而无需处理内存、指针和句柄。这行得通吗?

  • 一种方法是创建一个内存磁盘,虽然我不知道是否可以恢复。 (虚拟内存实际上是在硬盘驱动器上工作的,允许将内存保存/恢复为一个简单的文件)

  • 类似于this 问题,但有点不同,因为我不介意将应用程序内存重新插入到保存它的确切地址。PC 完全在我手中,为了为简单起见,假设没有其他应用在运行。

  • C# 不支持开箱即用的continuation,尽管 .NET 3.0 及更高版本中的 Workflow Foundation 允许停止和重新启动工作流。我想知道应用程序如何表现为工作流。

  • Raymond Chen 在blog post 中反对这一点,但这里也没有太多技术数据。

  • YAPM,开源进程监视器能够“显示/释放/更改保护/取消提交进程虚​​拟内存空间中的内存区域”。这可能与我所追求的相似吗?

【问题讨论】:

  • 我认为你能做的最好的就是二进制序列化和反序列化
  • Raymond Chen 的文章确实提供了技术数据,包括一些非常重要的示例(系统的其余部分不会休眠,可能会使所有外部句柄和资源无效)。

标签: c# .net windows winapi memory


【解决方案1】:

如果您想要一个未更改的保存/加载过程以避免首次使用,您可以查看serialization

实际上节省内存是可能的,但是当您尝试恢复它时会遇到解决问题,并且您可能没有足够的内存,可能没有相同大小的空闲块,等等开。

对象级别的序列化,甚至是一大组对象,将允许您以几乎相同的方式将它们及其状态保存到转储内存,但大大简化了加载过程并使其更加可靠。 .Net 提供了很好的序列化支持,并且可以输出到二进制文件(小但依赖于版本)或 XML(更大,人类可读,更灵活)。其他库可能会提供更多不同用途的方法(我相信有一个 JSON 方法,它稍微有点冗长,但适用于 Web 应用程序)。

根据您的应用程序的工作方式,您可能希望/能够在第一次运行时创建首次使用的模型,将它们序列化到磁盘,然后从那时起加载它们。通过一些工作,还应该可以将所有对象(不同类型的)添加到单个集合中并对其进行序列化,从而允许将所有数据存储在一个文件中。

所以是的,这是可能的,而且确实可能​​更快,虽然不是你最初的想法。

【讨论】:

  • 如果内存被重新插入到它被取出的确切地址怎么办?像 Windows 休眠/恢复之类的东西?整台电脑都在我的掌控之中。
  • 即使不是不可能,也很难保证这一点。 Hibernate 在内核级别上工作,因此除非您可以强制内核永远不要在该块中分配任何内存,加载存储的数据,然后将其映射到进程的虚拟内存映射中的特定地址,否则它不会发生。大多数或所有这些在 .Net 中是不可能的,甚至 C/asm 也可能无法直接与 WinAPI 一起工作。在 .Net 世界中,序列化绝对是一种更正确的方法,并且可以在以后省去很多麻烦(更简单、更安全)。
  • 可能性很小,但创建休眠文件的唯一方法是触发休眠,因此需要在 Windows 之前运行引导加载程序来复制然后换出休眠状态文件以供使用。乱搞内核的启动过程不是解决序列化问题的好方法。
  • 不太难。假设我们启动到 GRUB 或可能触发此类代码的东西。 hiberfile.sys 在您启动 Windows 后就无法访问?我建议复制备份以进行 NEXT 重新启动,以便在 Windows 中运行的应用程序可以做到这一点。这可能吗?
猜你喜欢
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2016-12-18
相关资源
最近更新 更多