บทความส่วนใหญ่สอนหา memory leak แต่นี้จะสอน สร้าง เพื่อรู้จักลักษณะ
A Simple Leak (Leak แบบง่าย)
เพิ่มอ็อบเจ็กต์ใหม่เข้า Array ตลอดเวลา:
a = []
b = {}
loop { sleep(1)
10_000.times { a << "abc" }
puts GC.stat(b)[:heap_live_slots]
}
นับอ็อบเจ็กต์เพิ่มขึ้นเรื่อยๆ เพราะ GC ไม่เก็บได้ (ถูก reference โดย array a) ถ้า a = nil; GC.start จะเก็บได้
C Extension Leak
C extension ใช้ malloc โดยไม่ free Ruby ไม่ควบคุมได้ leak ไม่見于 GC.stat แต่ memory usage เพิ่มขึ้น
void allocate_memory() {
for(int i = 0; i < 10000; i++) {
ptr = malloc(1000); // ไม่มี free()
}
}
Summary
ตอนนี้รู้ลักษณะ memory leak แล้ว จะช่วยหาได้เร็วขึ้น หมายเหตุ: Ruby 2.4.1 มี known memory leak ควร upgrade