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