我正在使用一个开源.NET应用程序,需要很长时间才能启动和初始化。它创建了数千个对象并将其配置为首次使用。我正在努力改善这个启动时间。
有没有办法使用Windows API或类似工具捕获应用程序内存,然后在重新启动PC后快速“恢复”此状态?基本上有一种方法可以访问和保存.NET应用程序的底层内存,并让CLR在以后“吸收”这个内存吗?
最简单的方法是使用Windows Hibernate创建“hiberfile.sys”,然后保存此文件的副本(如果可能的话)。每次启动Windows时,都会使用保存的“干净”版本覆盖现有的hiber文件,以便下次启动。这确保您可以保存/恢复应用程序状态,而无需处理内存,指针和句柄。这可行吗?
一种方法是创建一个mem-disk,虽然我不知道是否可以进行恢复。 (虚拟内存实际上可以在HDD上运行,允许将内存保存/恢复为简单文件)
与this问题类似,但有点不同,因为我不介意将应用程序内存重新插入保存的确切地址.PC完全在我手中,并且用于为简单起见,假设没有其他应用正在运行。
C#不支持continuation开箱即用,但.NET 3.0及更高版本的Workflow Foundation允许停止和重新启动工作流。我想知道应用程序如何作为工作流程。
Raymond Chen在blog post中反对这一点,但这里的技术数据也不多。
YAPM,一个开源流程监视器能够“显示/释放/更改保护/解除对进程虚拟内存空间中的内存区域”。这可能与我追求的类似吗?
答案 0 :(得分:2)
如果您希望保存/加载过程保持不变以避免首次使用,您可以查看serialization。
实际上可以保存内存,但是当你尝试恢复它时,你会遇到问题,并且你可能没有足够的内存,可能没有空闲块。相同的大小,等等。
在对象级别甚至是大量对象的序列化将允许您以几乎相同的方式保存它们和状态以转储内存,但是大大简化了加载过程并使其更加可靠。 .Net提供了非常好的序列化支持,可以输出到二进制文件(小但依赖于版本)或XML(更大,人类可读,更灵活)。其他库可能会提供更多不同用途的方法(我相信有一个JSON版本,它稍微冗长,但适用于网络应用程序)。
根据应用的工作方式,您可能希望/能够在第一次运行时创建首次使用的模型,将它们序列化为磁盘,然后从中加载它们。通过一些工作,还应该可以将所有对象(不同类型)添加到单个集合中并对其进行序列化,从而允许将所有数据存储在一个文件中。
所以是的,这是可能的,可能确实更快,尽管不是你最初的想法。