Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

สร้าง Memory Leak ใน Ruby โดยเจตนา: สาธิตปฏิบัติจริง

บทความส่วนใหญ่สอนหา 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