สำหรับผู้ที่ใช้งาน คอมพิวเตอร์ PC อยู่เป็นประจำทุกวัน อาจจะเคยประสบปัญหา อยู่ดี ๆ ก็รู้สึกว่าคอมพิวเตอร์ทำงานได้ช้าลงอย่างที่ไม่เคยก่อน คอมพิวเตอร์สเปกเทพของคุณ ได้กลายร่างไปเป็นหอยทากไปเสียอย่างนั้น วิธีแก้ไขปัญหามันก็ไม่ยาก เพราะแค่รีสตาร์ตระบบคอมพิวเตอร์สักรอบก็หายแล้ว
แล้วปัญหานี้มันมีสาเหตุมาจากอะไรล่ะ ?
ส่วนมากแล้ว อาการนี้นั้นเกิดขึ้นจากปัญหาที่ถูกเรียกว่า "หน่วยความจำรั่ว (Memory Leak)" ซึ่งในบทความนี้เราอยากจะมาอธิบายว่ามันคืออะไร ? สาเหตุมาจากไหนกันแน่ ?
ก่อนอื่น เพื่อให้เข้าใจเรื่องของ หน่วยความจำรั่ว (Memory Leak) ได้ง่ายขึ้น เราจะขอยกตัวอย่างเปรียบเทียบ เพื่อให้เห็นภาพได้ง่ายขึ้น
ลองจินตนาการว่าคอมพิวเตอร์ของเราคือเมือง ๆ หนึ่ง ถนนที่อยู่ภายในเมืองคือหน่วยความจำของคอมพิวเตอร์ และซอฟต์แวร์ที่ทำงานบนคอมพิวเตอร์ก็คือยานพาหนะต่าง ๆ ที่เคลื่อนที่อยู่บนถนน ทีนี้ ลองคิดว่าจะเกิดอะไรขึ้น หากรถที่วิ่งทำธุระเสร็จแล้วแทนที่จะวิ่งออกจากถนนไปหาที่จอดที่ถูกต้อง มันกลับเลือกที่จะจอดข้างถนนแบบไทยสไตล์ ก็ฉันจะจอดแบบนี้น่ะใครจะทำไม ? และเมื่อมีคันหนึ่งทำได้ ทุกคนก็ทำตาม จนสุดท้ายมีรถจอดเต็มถนนไปหมด ส่งผลให้พื้นที่ถนนหายไป การจราจรติดขัดไม่สามารถเคลื่อนที่ได้รวดเร็วเหมือนอย่างเคย ซึ่งนี่แหละที่ทางคอมพิวเตอร์เราจะเรียกว่า Memory Leak
ภาพจาก : https://www.baeldung.com/java-memory-leaks
Memory Leak จัดว่าเป็นปัญหาที่เกิดจากการเขียนซอฟต์แวร์ผิดพลาด ทำให้มันจัดสรรการใช้ทรัพยากรผิดพลาด โดยในการทำงานของซอฟต์แวร์ มันจะมีการส่ง Object (ในทางโปรแกรมคอมพิวเตอร์มันเป็นสิ่งที่รวมข้อมูล และสิ่งที่จำเป็นต่อการทำงานเข้าด้วยกัน) เข้าไปเก็บไว้บนแรม โดยซอฟต์แวร์จะมีการกำหนดขนาดพื้นที่ และตำแหน่งของหน่วยความจำที่ต้องการใช้ เมื่อ Object ทำงานเสร็จแล้ว ก็จะคืนทรัพยากรพื้นที่กลับให้ระบบ แต่หากตัวซอฟต์แวร์มีการเขียนโค้ดมาไม่ดี ลืมสั่งให้ซอฟต์แวร์คืนพื้นที่ ทรัพยากรหน่วยความจำของระบบก็จะถูกจองสะสมไปเรื่อย ๆ ทำให้ระบบคอมพิวเตอร์ทำงานได้ช้าลง หรือหากอาการรุนแรงก็อาจทำให้ระบบล่มหยุดทำงานจนต้องรีสตาร์ตเริ่มระบบใหม่
ในการทำงานของซอฟต์แวร์หนึ่งตัว มันประกอบขึ้นจากวัตถุ (Object) จำนวนมาก ทำให้การควบคุมการใช้ทรัพยากรของแต่ละ Object เป็นงานที่ท้าทายสำหรับนักพัฒนาอยู่ไม่น้อย
ในการทำงานของซอฟต์แวร์ บางครั้งมันจะมีการส่งคำร้องเพิ่มเติม เพื่อขอหน่วยความจำเพิ่มขึ้น หนึ่งในกฏทองคำในการเขียนซอฟต์แวร์ที่ดีคือ เมื่อมีการเรียกใช้หน่วยความจำไป จะต้องกำหนดให้คืนหน่วยความจำคืนเมื่อไม่มีความจำเป็นต้องใช้งานแล้วเสมอ หากทำได้ก็จะถือว่าซอฟต์แวร์ดังกล่าวถูกเขียนโค้ดมาได้ดี
ภาพจาก : https://favtutor.com/blogs/memory-leaks-cpp
แต่น่าเสียดาย ที่ไม่ใช่ซอฟต์แวร์ทุกตัวที่จะถูกเขียนมาได้เป็นอย่างดี เรื่องน่าปวดหัวคือ การที่ซอฟต์แวร์ล้มเหลวในการลบ Object ออกจากหน่วยความจำ ส่วนใหญ่มันจะไม่แสดงอาการในทันที ไม่ว่าจะเพราะ Object มีขนาดเล็ก หรือไม่ได้มีการทำงานร่วมกับ Object อื่น ๆ มากนัก ถึงแม้ซอฟต์แวร์จะปิดการทำงานไปแล้ว แต่ Object ก็จะยังโดนดองคาไว้อยู่อย่างนั้น
หรือบางครั้งซอฟต์แวร์เขียนมาอย่างดีเลย แต่ด้วยเหตุผลหลายอย่าง ซอฟต์แวร์เกิดค้าง แครชกะทันหัน ทำให้ขั้นตอนการคืนทรัพยากรหน่วยความจำที่ควรจะเกิดขึ้น มันไม่มีโอกาสได้ทำงานอย่างถูกต้อง ส่งผลให้มีชิ้นส่วนหน่วยความจำที่ถูกจองไว้กลายเป็นขยะอยู่บนหน่วยความจำ แต่ระบบก็เข้าใจว่าพื้นที่ดังกล่าวยังถูกใช้งานอยู่
Memory Leak ทำให้ประสิทธิภาพของคอมพิวเตอร์ลดลง เพราะมันลดพื้นที่หน่วยความจำที่ระบบสามารถเรียกใช้ได้ และเมื่อถึงจุดที่หน่วยความจำไม่เพียงพอ ระบบก็จะไม่สามารถทำงานได้อีกต่อไป อาการอย่างเบาซอฟต์แวร์ก็แค่หยุดทำงาน อาการหนักก็คือคอมพิวเตอร์ดับรีสตาร์ตตัวเองไปเลย นั่นทำให้มีหลายเหตุผลที่เราควรหลีกเลี่ยง Memory Leak
โดยเมื่อพื้นที่หน่วยความจำลดลง ซอฟต์แวร์ และระบบคอมพิวเตอร์จะทำงานได้ช้าลง จากการที่หน่วยความจำเหลือน้อย ซึ่งเป็นประสบการณ์ที่ผู้ใช้งานไม่อยากเจอกันอย่างแน่นอน นอกจากนี้ ยังเป็นการใช้ทรัพยากรที่ระบบมีไปอย่างเปล่าประโยชน์
อย่างไรก็ตาม ในปัจจุบันนี้ Memory Leak ไม่ได้อันตรายมากนัก เพราะในระบบปฏิบัติการรุ่นใหม่ ๆ ในปัจจุบัน จะมีคุณสมบัติในการเคลียร์พื้นที่ของหน่วยความจำอัตโนมัติในทันทีที่ซอฟต์แวร์ปิดตัวลง นั่นทำให้ต่อให้เกิด Memory Leak มันก็เกิดขึ้นเพียงชั่วคราว และถูกแก้ไขไปให้ที่ผู้ใช้งานไม่ต้องทำอะไรเลย
เราเข้าใจแล้วว่า Memory Leak คืออะไร ? แล้วเราจะรู้ได้อย่างไร ? ว่าคอมพิวเตอร์ของเราเกิด Memory Leak อยู่ ก็มีหลายวิธีที่สามารถตรวจสอบได้ อย่างเช่น
ภาพจาก : https://docs.oracle.com/cd/E13188_01/jrockit/docs50/usingMMLeak/memleak.html
|
แอดมินสายเปื่อย ชอบลองอะไรใหม่ไปเรื่อยๆ รักแมว และเสียงเพลงเป็นพิเศษ |