Memory Leak (รั่วของหน่วยความจำ) คือการจัดสรรหน่วยความจำผิดปกติในโปรแกรมคอมพิวเตอร์ เกิดขึ้นเมื่อตำแหน่ง RAM ที่ไม่ได้ใช้งานยังคงไม่ถูกปล่อยคืน ไม่สับสนกับ Space Leak ซึ่งหมายถึงโปรแกรมใช้ RAM มากกว่าที่จำเป็น Memory Leak ใน Windows 11/10/8/7 เกิดขึ้นเมื่อหน่วยความจำเข้าถึงไม่ได้แม้จะไม่ได้ใช้งาน
Memory Leaks ใน Windows 11/10
ก่อนเริ่ม ต้องรู้ว่า Memory leak เป็น ปัญหาซอฟต์แวร์ที่ต้องแก้ไข (debug) เช่นใน Java, JavaScript, C/C++, Windows เป็นต้น ไม่ต้องเปลี่ยน RAM หรือฮาร์ดดิสก์ทางกายภาพ
ทำไมจึงไม่ดี
ชัดเจนว่า Memory leak ไม่ดีเพราะเป็นบั๊ก/ข้อบกพร่อง แต่ส่งผลกระทบอย่างไรบ้าง:
- หน่วยความจำไม่ถูกปล่อยคืนแม้ไม่ได้ใช้ → หน่วยความจำหมด
- หน่วยความจำหมด → Software aging (ซอฟต์แวร์เสื่อมสภาพ)
- หน่วยความจำว่างน้อยลง → เวลาตอบสนองเพิ่มขึ้น ประสิทธิภาพลดลง
- Memory leak ที่ไม่ได้ตรวจสอบ → แอปพลิเคชันอาจ Crash
เพื่อระบุ Memory leak โปรแกรมเมอร์ต้องเข้าถึง Source code ของโปรแกรมนั้น
การค้นหาจุดรั่ว
ขั้นตอนพื้นฐานในการค้นหา Memory leak:
- Affirmation (การยืนยัน): กำหนดว่า leak เกิดขึ้นจริงหรือไม่
- Finding Kernel-mode memory leak: ค้นหา leak จาก kernel-mode driver component
- Finding User-mode memory leak: ค้นหา leak จาก user-mode driver หรือแอป
การจัดสรรหน่วยความจำ (Memory Allocation)
แอปพลิเคชันจัดสรร RAM แบบต่างกัน ถ้าไม่ปล่อยคืนหลังใช้ จะเกิด memory leak ไม่ว่าจะจัดสรรแบบไหน รูปแบบทั่วไป:
- HeapAlloc สำหรับ heap memory (C/C++ runtime equivalents: malloc และ new)
- VirtualAlloc สำหรับจัดสรรโดยตรงจาก OS
- Kernel32 APIs จอง kernel memory ให้แอป (เช่น CreateFile, CreateThread)
- User32 APIs และ Gdi32 APIs
ป้องกัน Memory Leaks ใน Windows
การป้องกันดีกว่าการรักษา วิธีป้องกัน:
การตรวจสอบพฤติกรรม (Monitoring habits)
ต้องตระหนักการใช้ RAM ผิดปกติของโปรแกรมแต่ละตัว เปิด Task Manager (Ctrl+Shift+Esc) เพิ่มคอลัมน์ Handles, User Objects, GDI Objects เป็นต้น จะช่วยติดติดตามการใช้ทรัพยากรได้ง่ายขึ้น
อ่านเพิ่ม: หน่วยความจำในคอมพิวเตอร์มีกี่ประเภท?
เครื่องมือของ Microsoft สำหรับวินิจฉัย Memory Leaks
เครื่องมือต่างๆ สำหรับโหมดการจัดสรรที่ต่างกัน:
- Application Verifier - วินิจฉัย heap leaks
- UMDH (ส่วนหนึ่งของ Windows Debugging Tools) - วินิจฉัย leaks ต่อ process โดยติดตาม heap allocations
- Trace Capture - วิเคราะห์การใช้ RAM อย่างละเอียด
- Xperf - ติดตามรูปแบบ heap allocation
- CRT Debug Heap - ติดตาม heap allocations และช่วยให้ coding practices ลด leaks
- JavaScript Memory Leak Detector - debug memory leaks ในโค้ด JavaScript
เคล็ดลับการใช้งาน
- ใช้ kernel HANDLEs และ smart pointers สำหรับ Win32 resources และ heap allocations
- ใช้ classes สำหรับ automatic resource management ของ kernel allocations จาก ATL library C++ standard มี auto_ptr สำหรับ heap allocations
- ห่อหุ้ม COM interface pointers ด้วย "smart pointers" ผ่าน _com_ptr_t, _bstr_t, _variant_t
- ติดตาม .NET code สำหรับการใช้หน่วยความจำผิดปกติ
- หลีกเลี่ยง multiple exit paths ในฟังก์ชัน เพื่อให้ allocations ถูกปล่อยคืนจากตัวแปรในส่วนใหญ่เมื่อจบฟังก์ชัน
- ใช้ native exceptions เฉพาะหลังปล่อยคืน allocations ทั้งหมดใน _finally block ห่อ heap และ handle allocations ด้วย smart pointers เพื่อใช้ C++ exceptions
- เรียก PropVariantClear ก่อน reinitialize หรือ discard PROPVARIANT object ทุกครั้ง
แก้ไข Memory Leaks ใน Windows (Troubleshoot)
ก่อนเริ่ม จดจำ: สร้าง System Restore Point ก่อน
1. ปิดโปรเซสและรีสตาร์ท
ถ้าเห็นโปรเซสไม่จำเป็นใช้ RAM มากเกินไป ให้ End Process ใน Task Manager ต้อง รีสตาร์ทอุปกรณ์ เพื่อให้พื้นที่ที่ปล่อยคืนพร้อมสำหรับโปรเซสอื่น ไม่รีสตาร์ท Memory leak จะไม่หาย โปรเซสที่มักทำช้า PC คือ Runtime Broker ลองปิดดูว่าช่วยได้ไหม
2. Memory Diagnostic Tools
เข้าถึงเครื่องมือวินิจฉัยหน่วยความจำใน Windows:
- เซฟงานสำคัญทั้งหมด
- กด Win + R เปิด Run window
- พิมพ์ mdsched.exe ใน Run window
- รีสตาร์ท PC
- หลังรีสตาร์ท ทำ Basic scan หรือเลือก Advanced options เช่น Test mix หรือ Pass count
- กด F10 เริ่มทดสอบ
เหล่านี้เป็นการแก้ชั่วคราว
3. ตรวจสอบอัปเดตไดรเวอร์
ไดรเวอร์เก่าแก่ทำให้เกิด memory leaks อัปเดตไดรเวอร์ทั้งหมด:
- กด Win + R พิมพ์ devmgmt.msc กด Enter เปิด Device Manager
- ตรวจสอบไดรเวอร์เก่าแก่และอัปเดตทั้งหมด
- ตรวจสอบอัปเดตที่พลาดใน Windows Update
4. เพิ่มประสิทธิภาพ (Optimize performance)
ปรับ Windows ให้ประสิทธิภาพดีที่สุด จะจัดการทุกอย่างรวมถึง processor scheduling และ memory usage เพื่อหยุด memory leaks:
- คลิกขวา This PC เลือก Advanced settings ด้านซ้าย
- แท็บ Advanced > Performance > Settings
- ติ๊ก Adjust for best performance กด OK
- รีสตาร์ทและตรวจสอบ
5. ปิดโปรแกรมที่รันตอน Startup
ปิดโปรแกรมที่ทำปัญหาเป็นวิธีเดียวที่จะกำจัด memory leak ไปที่ Task Manager ปิดโปรแกรมที่ทำปัญหา ถ้าไม่รู้ว่าโปรแกรมไหนทำปัญหา:
- ไป Task Manager
- ไปแท็บ Startup
- Disable โปรแกรม startup ที่ไม่จำเป็นต้องรันเริ่มต้น
6. จัดกลุ่มข้อมูลฮาร์ดดิสก์ (Defrag Hard Drive)
Windows 10 ทำอัตโนมัติ แต่อาจต้องทำเองบ้างเพื่อเพิ่มประสิทธิภาพ:
- ไป This PC หรือ My Computer
- คลิกขวา System drive (ปกติ C:) > Properties > Tools > Optimize
- เลือกไดรฟ์ที่จะ defrag > Analyze
รีสตาร์ทหลังจัดกลุ่มข้อมูลเสร็จ
7. ล้าง Page File เมื่อปิดเครื่อง
ซับซ้อนขึ้น แต่ไม่ต้องกังวล วิธีล้าง Page File ทุกครั้งที่ปิดเครื่อง:
- พิมพ์ regedit ใน Search เปิด Registry Editor
- ไปที่พาธ:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
- เปลี่ยนค่า ClearPageFileAtShutDown เป็น 1
- บันทึกและรีสตาร์ท
กระบวนการปิดเครื่องจะช้าลงเล็กน้อย
8. ปิด Superfetch (SysMain)
บริการ Windows นี้เพิ่มประสิทธิภาพโดยลดเวลา boot จัดการ RAM ใช้งาน หลังปิด Superfetch อาจไม่สะดวก แต่ลองทำดูถ้าจำเป็น ตัวอย่างอย่างน้อยเพื่อแยกปัญหา:
- ค้นหา services.msc ไป Services Manager
- หา Superfetch (หรือ SysMain ใน Windows 10 ใหม่ๆ) คลิกขวา > Properties
- เลือก Stop
- ตั้งค่า Startup type = Disabled
- รีสตาร์ท PC ตรวจสอบประสิทธิภาพ
เปิด Superfetch กลับมาถ้ายังไม่ดี
9. ตรวจสอบมัลแวร์
ใช้ Antivirus ภายนอกหรือ Windows Defender สแกนและกำจัดมัลแวร์ ตรวจสอบว่า Antivirus อัปเดตรองรับ OS อยู่ ไม่ให้มันกลายเป็นสาเหตุ memory leak เอง
วิธีแก้และป้องกัน memory leaks ทุกอย่างอยู่ที่นี่แล้ว อ่านเพิ่มได้ที่ MSDN และ Microsoft