我有一個簡單的客戶端和使用lidgren的服務器。客戶端不斷向服務器發送請求(消息由1個字節組成,值爲1),客戶端以「數據」(2000個ushorts)響應。它每秒鐘處理約20次。我將傳入的數據存儲在List中,每次收到數據時都會清除它。問題是,我正在監視任務管理器中client.exe的內存使用情況,並且它正在進行中。它在十分鐘內漲到了大約100mb。我可以偶爾吸引垃圾收集器運行,但它似乎只是減少了內存使用量。爲什麼我的簡單的lidgren客戶端使用這麼多的內存?
這裏是我的服務器代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lidgren.Network;
using System.Threading;
namespace Client
{
class Program
{
static void Main(string[] args)
{
NetPeerConfiguration config = new NetPeerConfiguration("testapp");
config.UseMessageRecycling = true;
config.EnableMessageType(NetIncomingMessageType.DiscoveryRequest);
NetClient netClient = new NetClient(config);
netClient.Start();
netClient.DiscoverLocalPeers(12313);
List<ushort> mylist = new List<ushort>();
NetIncomingMessage msg;
while (true)
{
if (Console.KeyAvailable && Console.ReadKey().Key == ConsoleKey.G)
{
GC.Collect();
}
while ((msg = netClient.ReadMessage()) != null)
{
switch (msg.MessageType)
{
case NetIncomingMessageType.DiscoveryResponse:
netClient.Connect(msg.SenderEndpoint);
Thread.Sleep(1000);
//request data from server
NetOutgoingMessage nom = netClient.CreateMessage();
nom.Write((byte)1);
netClient.SendMessage(nom, NetDeliveryMethod.ReliableUnordered);
break;
case NetIncomingMessageType.Data:
mylist.Clear();
for (ushort n = 0; n < 2000; n++) mylist.Add(msg.ReadUInt16());
//request more data
NetOutgoingMessage nom2 = netClient.CreateMessage();
nom2.Write((byte)1);
netClient.SendMessage(nom2, NetDeliveryMethod.ReliableUnordered);
break;
default:
break;
}
netClient.Recycle(msg);
}
}
}
}
}
,這裏是我的客戶代碼:我一直在使用.NET內存分析器嘗試和盡我所能確定
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lidgren.Network;
using System.Threading;
namespace Server
{
class Program
{
static void Main(string[] args)
{
NetServer server = null;
NetPeerConfiguration config = new NetPeerConfiguration("testapp");
config.EnableMessageType(NetIncomingMessageType.DiscoveryRequest);
config.Port = 12313;
server = new NetServer(config);
server.Start();
NetIncomingMessage msg;
while (true)
{
while ((msg = server.ReadMessage()) != null)
{
switch (msg.MessageType)
{
case NetIncomingMessageType.DiscoveryRequest:
Console.WriteLine("Discovery");
server.SendDiscoveryResponse(null, msg.SenderEndpoint);
break;
case NetIncomingMessageType.Data:
byte mtype = msg.ReadByte();
if (mtype == 1)
{
//user is requesting an update.
NetOutgoingMessage nom = server.CreateMessage();
for (ushort n = 0; n < 2000; n++) nom.Write(n);
server.SendMessage(nom, msg.SenderConnection, NetDeliveryMethod.ReliableUnordered);
}
Thread.Sleep(50);
break;
default:
break;
}
server.Recycle(msg);
}
}
}
}
}
libgren堅持我的傳入數據的地方,雖然我不是很瞭解內部。我最好的猜測是太多的數據發送得太快,並且正在客戶端的某個地方排隊。這是否發生?服務器內存使用情況穩定。
您可能有更好的機會聯繫項目維護人員並向他們發送bugreport。 – ChrisWue