From 09ad2ca2729c245c223e783a6a0f41394d836f2e Mon Sep 17 00:00:00 2001 From: clowwindy Date: Tue, 18 Nov 2014 21:55:45 +0800 Subject: [PATCH] release memory periodically --- .../Controller/ShadowsocksController.cs | 21 +++++++++++++++ shadowsocks-csharp/Program.cs | 3 ++- shadowsocks-csharp/Util/Util.cs | 30 ++++++++++++++++++++++ shadowsocks-csharp/View/MenuViewController.cs | 3 +-- shadowsocks-csharp/shadowsocks-csharp.csproj | 1 + 5 files changed, 55 insertions(+), 3 deletions(-) create mode 100755 shadowsocks-csharp/Util/Util.cs diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index cb6cce11..b4de4cf9 100755 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -14,6 +14,8 @@ namespace Shadowsocks.Controller // manipulates UI // interacts with low level logic + private Thread _ramThread; + private Local local; private PACServer pacServer; private Configuration _config; @@ -58,6 +60,7 @@ namespace Shadowsocks.Controller } UpdateSystemProxy(); + StartReleasingMemory(); } public Server GetCurrentServer() @@ -161,6 +164,8 @@ namespace Shadowsocks.Controller { ConfigChanged(this, new EventArgs()); } + + Util.Util.ReleaseMemory(); } @@ -180,5 +185,21 @@ namespace Shadowsocks.Controller { UpdateSystemProxy(); } + + private void StartReleasingMemory() + { + _ramThread = new Thread(new ThreadStart(ReleaseMemory)); + _ramThread.IsBackground = true; + _ramThread.Start(); + } + + private void ReleaseMemory() + { + while (true) + { + Util.Util.ReleaseMemory(); + Thread.Sleep(30 * 1000); + } + } } } diff --git a/shadowsocks-csharp/Program.cs b/shadowsocks-csharp/Program.cs index abfc52a9..6b15ea9c 100755 --- a/shadowsocks-csharp/Program.cs +++ b/shadowsocks-csharp/Program.cs @@ -12,13 +12,13 @@ namespace Shadowsocks { static class Program { - /// /// 应用程序的主入口点。 /// [STAThread] static void Main() { + Util.Util.ReleaseMemory(); using (Mutex mutex = new Mutex(false, "Global\\" + "71981632-A427-497F-AB91-241CD227EC1F")) { Application.EnableVisualStyles(); @@ -41,6 +41,7 @@ namespace Shadowsocks ShadowsocksController controller = new ShadowsocksController(); MenuViewController viewController = new MenuViewController(controller); + Util.Util.ReleaseMemory(); Application.Run(); } } diff --git a/shadowsocks-csharp/Util/Util.cs b/shadowsocks-csharp/Util/Util.cs new file mode 100755 index 00000000..afb5539a --- /dev/null +++ b/shadowsocks-csharp/Util/Util.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; + +namespace Shadowsocks.Util +{ + public class Util + { + public static void ReleaseMemory() + { + // release any unused pages + // making the numbers look good in task manager + // this is totally nonsense in programming + // but good for those users who care + // making them happier with their everyday life + // which is part of user experience + GC.Collect(GC.MaxGeneration); + GC.WaitForPendingFinalizers(); + SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, + (UIntPtr)0xFFFFFFFF, (UIntPtr)0xFFFFFFFF); + } + + [DllImport("kernel32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool SetProcessWorkingSetSize(IntPtr process, + UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize); + } +} diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index 158edb5b..ad46cba7 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -299,8 +299,7 @@ namespace Shadowsocks.View void configForm_FormClosed(object sender, FormClosedEventArgs e) { configForm = null; - GC.Collect(); - GC.WaitForPendingFinalizers(); + Util.Util.ReleaseMemory(); ShowFirstTimeBalloon(); } diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index e9d322b2..b04eff8b 100755 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -84,6 +84,7 @@ + Form