【发布时间】: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