我有一个程序执行24小时,然后重新启动。
如何将 main()转移到一个单独的应用程序域,该域每24小时被拆除并刷新一次,以便彻底消除任何潜在的内存泄漏?
答案 0 :(得分:17)
直到你说:
为了彻底消除任何潜在的内存泄漏?
如果您想在其他应用领域中运行代码,那么有很多资源可以解决这个问题,例如Executing Code in Another Application Domain (C# and Visual Basic)。基本原则是创建一个继承自MarshalByRefObject
的类。然后,您创建新的应用程序域并指示它创建该对象的实例 - 此对象就是您进入应用程序域的“入口点”:
AppDomain newAppDomain = AppDomain.CreateDomain("NewApplicationDomain");
ProxyObject proxy = (ProxyObject)newAppDomain.CreateInstanceAndUnwrap("MyAssembly", "MyNamespace.MyProxy");
然而,在C#中,实际上没有任何“内存泄漏”这样的东西,充其量你只是有一些无意中保留在范围内的对象。如果是这种情况,那么app域就是矫枉过正 - 你真正需要做的就是删除对不再需要的托管对象的引用,垃圾收集器会为你整理它们。
如果您在非托管代码中存在真正的内存泄漏,则应用程序域也无法帮助您。非托管类型不受应用程序域限制,因此当应用程序域被销毁时,将不会释放在应用程序域“内部”分配的任何非托管内存。在这种情况下,您最好使用单独的流程。
答案 1 :(得分:8)
我创建了一个类,允许您在单独的应用程序域中执行代码,这样您就可以处置应用程序域并重新创建它:Executing Code in a Separate Application Domain Using C#
答案 2 :(得分:-2)
你做不到。进程是独立且独立的,您无法将线程从一个进程转移到另一个进程。
但是,如果您无法在内部修复内存泄漏,那么可以执行的操作是创建一个监视程序,该程序在应用程序停止运行时启动应用程序,并将应用程序设置为仅在单一执行模式下运行。