C# System.OutOfMemoryException';晚上10点以后我被解雇了。我不能捕捉到实际的错误
在服务器上安装了以下软件:C# System.OutOfMemoryException';晚上10点以后我被解雇了。我不能捕捉到实际的错误,c#,multithreading,sockets,tcpclient,C#,Multithreading,Sockets,Tcpclient,在服务器上安装了以下软件: Windows Server 2012,SQL Server Symentec防病毒软件 基于Nginx、mssqlserver数据库的指纹阅读器 我找不到错误。线程抛出系统错误。Outofmemory和服务器有6GB的可用内存。一个套接字接收的最大数据小于4kb class ServerModule { TcpListener serverSocket; public void StartServer() { serverS
class ServerModule
{
TcpListener serverSocket;
public void StartServer()
{
serverSocket.Start();
while (true)
{
try
{
if (cmd == -1)
{
break;// stop loop
}
Console.WriteLine("Listening");
TcpClient tc= serverSocket.AcceptTcpClient();
System.Threading.Thread obj_thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(ProcessData));
obj_thread.Start(tc);
}
catch (Exception ex)
{
ErrorLogger.LogError("StartServer::", ex);
}
}
}
public void ProcessData(object ob)
{
TcpClient tcp_socket = (TcpClient)ob;
NetworkStream ns = null;
try
{
ns = tcp_socket.GetStream();
int num = 0;
byte[] obj_data = new byte[tcp_socket.ReceiveBufferSize];
num = ns.Read(obj_data, 0, tcp_socket.ReceiveBufferSize);
tcp_socket.Close();
tcp_socket = null;
}
catch (Exception ex)
{
ErrorLogger.LogError("ProcessData::", data_from_device, ex);
if (tcp_socket != null)
{
tcp_socket.Close();
tcp_socket = null;
}
Console.WriteLine("Close with exception");
}
}
}
您的代码正在抛出
OutOfMemoryException
,因为其中创建了许多线程。看:
// in a infinite loop
while (true)
{
...
// for each TcpClient
TcpClient tc= serverSocket.AcceptTcpClient();
// you create a thread!
System.Threading.Thread obj_thread = new System.Threading.Thread
}
这是代码中最糟糕的事情。由于大量线程同时尝试侦听tcpclient
,因此应用程序将处于饥饿状态。应用程序中建议的线程数等于服务器机器上的内核数()
您真的应该使用一些线程池,要么是您自己编写的(我个人不推荐),要么是已经内置的()
如果您使用的是.NET 4.5,请使用简化代码。目前,您的应用程序不稳定且容易出错 如果出于某种原因,您仍然认为每次调用
TcpClient
时都必须创建线程(我认为这是完全错误的),那么您应该阅读本手册:
您无需等待它崩溃后才发现内存泄漏。你可以将一个内存配置文件连接到你的应用程序上并进行练习,你应该能够在它因内存不足异常而崩溃之前找到泄漏途径。问题中的代码实际上并不处理数据。它获取流,分配缓冲区,将字节复制到缓冲区,然后将其留给垃圾收集器稍后收集。您是否删除了代码/简化了示例?我必须记录来自900多个gps/gprs设备的数据。线程原因:在数据保存之前,对数据进行分析和处理,这需要时间。所以每次套接字接受时,都会有一个线程。是创建的。工作线程不需要花费太多时间0.20-1毫秒。线程池将降低整个系统的速度。我需要升级RAM吗。目前它运行良好,400个gps设备发送数据,处理器为2%。所有参数都是稳定的。您是否使用ADPool来测量性能?你重复使用线程了吗?如果No
是任何问题的答案,您应该进一步调查您的问题。现在您的系统有太多线程无法同时处理。要尝试线程池,将向池传递套接字。我会通知您线程池已解决问题,服务器运行正常,问题已解决。谢谢