我有一个程序执行 24 小时,然后重新启动。
如何将main()从一个单独的应用程序域转移到一个单独的应用程序域中,该域每 24 小时被拆除和刷新一次,以完全消除任何潜在的内存泄漏?
我有一个程序执行 24 小时,然后重新启动。
如何将main()从一个单独的应用程序域转移到一个单独的应用程序域中,该域每 24 小时被拆除和刷新一次,以完全消除任何潜在的内存泄漏?
直到你说:
为了完全消除任何潜在的内存泄漏?
如果您想在另一个应用程序域中运行代码,那么有很多关于如何执行此操作的资源,例如在另一个应用程序域中执行代码(C# 和 Visual Basic)。基本原则是创建一个继承自MarshalByRefObject
. 然后,您创建新的应用程序域并指示它创建该对象的实例 - 然后此对象是您进入应用程序域的“入口点”:
AppDomain newAppDomain = AppDomain.CreateDomain("NewApplicationDomain");
ProxyObject proxy = (ProxyObject)newAppDomain.CreateInstanceAndUnwrap("MyAssembly", "MyNamespace.MyProxy");
然而,在 C# 中并没有真正意义上的“内存泄漏”之类的东西,充其量只是有无意中保留在范围内的对象。如果是这种情况,那么应用程序域就太过分了——您真正需要做的就是删除对不再需要的托管对象的引用,垃圾收集器会为您整理它们。
如果您在非托管代码中存在真正的内存泄漏,那么应用程序域也无济于事。非托管类型不受应用程序域的限制,因此当应用程序域被销毁时,在应用程序域“内部”分配的任何非托管内存都不会被释放。在这种情况下,您最好使用单独的进程。
我创建了一个类,它允许您在单独的应用程序域中执行代码,这将允许您处理应用程序域并重新创建它:使用 C# 在单独的应用程序域中执行代码
你不能。一个进程是孤立和独立的,您不能将线程从一个进程转移到另一个进程。
但是,如果您绝对无法在内部修复内存泄漏,您可以做的是创建一个看门狗程序,该程序在应用程序停止运行时启动它,并将您的应用程序设置为仅在单次执行模式下运行。