(Real-Life Example: TCP Connections, Packet Buffers, Device Dictionaries, Streams)”**
Congrats! You’ve reached Blog 50, और अब हम उस topic पर आए हैं
जो किसी भी High-Performance GPS Server को चलाने का सबसे बड़ा secret है:
GPS servers अक्सर crash नहीं होते,
वो धीरे-धीरे memory leak से मरते हैं।
इस ब्लॉग में हम deep सीखेंगे:
Garbage Collector कैसे काम करता है
क्या चीजें memory leak करती हैं
StringBuilder leaks
Dictionary growth issue
TCP stream memory safety
Async tasks memory leaks
कैसे GPS server को memory optimized बनाना है
GC automatically:
✔ Unused memory free करता है
✔ Objects delete करता है
✔ Heap clean करता है
✔ Memory fragmentation reduce करता है
You don’t need:
❌ free()
❌ delete()
But you must code properly to avoid leaks.
जब RAM बढ़ती जाए लेकिन free न हो → leak.
Symptoms in GPS Server:
RAM keeps increasing
CPU spike
Slow response
Delayed packet processing
Eventually crash
IMEIs add होते रहते हैं → remove नहीं होते।
Old data append होता रहता है।
Client disconnect हो गया → stream alive.
Task.Run loops that never stop.
StreamWriter leak.
Queue grows → crash.
Bad:
ConnectedDevices[imei] = device;
If device disconnects → still stored → leak.
Fix:
if(!client.Connected)
ConnectedDevices.Remove(imei);
Or even better → background cleanup job.
Bad:
buffer.Append(chunk); // but never cleared properly
Fix after extracting packets:
buffer.Clear(); buffer.Append(remainingData);
Other trick:
If buffer > 10,000 chars → reset completely:
if(buffer.Length > 10000)
buffer.Clear();
Bad:
client.Close(); // NOT enough!
Fix:
stream.Close(); stream.Dispose(); client.Close(); client.Dispose();
Always dispose both stream & client.
Bad:
var sw = new StreamWriter("log.txt", true);
sw.WriteLine("packet");
// sw not closed → memory leak + file lock
Fix:
using(var sw = new StreamWriter("log.txt", true))
{
sw.WriteLine("packet");
}
or Serilog (best solution).
Bad:
Task.Run(() =>
{
while(true)
{
DoWork();
Thread.Sleep(1000);
}
});
This thread never dies → leak.
Fix:
✔ Use IHostedService in .NET
✔ Use cancellation tokens
Example:
while(!token.IsCancellationRequested)
{
await DoWork();
}
Bad:
PacketQueue.Enqueue(pkt); // but never dequeued fast enough
Fix:
Use bounded queue
Backpressure logic
Drop old packets
Use ConcurrentQueue + consumer thread
High-performance GPS servers use object pooling:
ArrayPool<byte>.Shared.Rent(1024);
Use it to reuse byte arrays → reduce allocation.
Track:
RAM usage
Gen0/Gen1/Gen2 GC counts
Large Object Heap (LOH) fragmentation
Use:
GC.GetTotalMemory(false)
Or performance counters.
| Problem | Fix |
|---|---|
| Dictionary grows forever | remove inactive devices |
| Packet buffers too large | periodic buffer reset |
| Streams not disposed | always using |
| Async infinite loops | cancellation tokens |
| Large strings | minimize concatenation |
| Logging streams | Serilog async sink |
| Queue overflow | bounded queues |
Every midnight → clear all packet buffers.
If device 24h से offline → remove from dictionary.
Production में कई कंपनियाँ दिन में 1 बार server recycle करती हैं।
Low memory consumption.
Create once → reuse.
Memory Management आपके server को बनाता है:
✔ Stable for months
✔ Zero crashes
✔ Low RAM usage
✔ High performance
✔ 24×7 continuous running
GPS server running at scale (5k–20k devices) में
Memory Leaks = सबसे बड़ा enemy
और यह blog आपको उन्हें पूरी तरह खत्म करने में मदद करता है।
0 Comments
Thanks for Commenting on our blogs, we will revert back with answer of your query.
EmojiThanks & Regards
Sonu Yadav