จากที่พูดคุยเรื่อง Memory leak สำหรับการใช้งาน package net/http ในภาษา Go
ซึ่งมี 2 เรื่องคือ
- ถ้าไม่ปิด body ของ request จะเกิดอะไรขึ้น ?
- ถ้าไม่ปิด body ของ response จะเกิดอะไรขึ้น ?
ในข้อแรกนั้นจากเอกสารใน code บอกว่า
ถ้าฝั่ง client side แล้ว
body ของ request เป็น nil เช่นใช้งาน HTTP GET แล้ว
ไม่จำเป็นต้อง close นะ
แต่ถ้าไม่ใช่ nil ก็จำเป็นต้องปิดเอง !!
ในข้อที่สอง ตรงนี้ใน project ใช้บ่อยเลยลองไปดูหน่อยนึง
จากบทความเรื่อง 50 Mistake สำหรับ Golang ก็พูดเรื่องนี้
ว่าควรปิดและปิดให้ถูกต้องด้วย
จากการที่ไปดู code และลองเอามาเขียนให้เข้าใจง่าย ๆ
ก็เจอใน web พอดี
เป็นการไปเรียกข้อมูลมาจาก web/api ต่าง ๆ
ซึ่งในฝั่งเรียกหรืือ client จะใช้งาน Goroutines
พบว่า ถ้าเราไม่ทำการปิด body ของ response พบว่า
จะมี Goroutines ค้างอยู่เพียบเลย มัน leak ไหมนะ !!
ดังนี้
ผลการ run เป็นดังนี้
[code] $go run before.go Number of Goroutines start: 1 Number of Goroutines end: 201 [/code]ดังนั้นจำเป็นต้องแก้ไขด้วยการปิด body ของ response ดังนี้
[gist id="0186020130604d28f4bea0a7c3bc780c" file="after.go"]ผลที่ได้คือ จำนวนของ Goroutines ที่ค้างจะเหลือน้อยมาก ๆ
นั่นคือ มีการคืนหน่วยความจำกลับมาให้ระบบ
ตรงนี้น่าจะลดเรื่อง Memory leak ลงไปได้เยอะเลย
Reference Websites