মেমরি লিক কিভাবে খুঁজে বের করতে হয় সে সম্পর্কে কিছু নিবন্ধ আছে।
কিন্তু কিভাবে একটি তৈরি করবেন?
আমি মনে করি এটি একটি আকর্ষণীয় ব্যায়াম হবে যাতে আপনি জানেন যে রুবিতে মেমরি লিক কেমন দেখায়৷
৷আসুন কিছু উদাহরণ দেখি।
একটি সাধারণ লিক
আমরা একটি অ্যারেতে নতুন বস্তু যোগ করে একটি মেমরি লিক তৈরি করতে পারি।
এরকম :
a = [] b = {} loop { sleep(1) 10_000.times { a << "abc" } puts GC.stat(b)[:heap_live_slots] }
এটি প্রতি সেকেন্ডে 10k স্ট্রিং তৈরি করে এবং এটি একটি বস্তুর সংখ্যা প্রিন্ট করে:
285051 295052 305053 315054 325055 335056 345057 355058
গণনা ক্রমাগত বাড়তে থাকে কারণ GC এই স্ট্রিংগুলি সংগ্রহ করতে পারে না, সেগুলি ধারণকারী অ্যারে (a
) দ্বারা উল্লেখ করা হচ্ছে )।
যদি a
সুযোগের বাইরে চলে যায় যা GC কে এই সমস্ত "abc"
সংগ্রহ করতে দেয় স্ট্রিং আপনি a
সেট করে উপরের উদাহরণ দিয়ে এটি পরীক্ষা করতে পারেন শূন্য থেকে, তারপর GC.start
চালান .
আপনি এখানে একটি লাইভ উদাহরণ পেতে পারেন, শুধু run
এ ক্লিক করুন ফলাফল দেখতে।
C এক্সটেনশন লিক
আপনি যখন রুবি থেকে একটি বস্তু তৈরি করেন তখন GC কতটা মেমরি ব্যবহার করছে তার ট্র্যাক রাখে, কিন্তু C এক্সটেনশন ব্যবহার করার সময় রুবি কি ঘটবে তার উপর কোন নিয়ন্ত্রণ থাকে না।
আপনি যদি এইরকম একটি সি এক্সটেনশন তৈরি করেন:
#include <ruby.h> #include "extconf.h" void *ptr; void Init_extension() { allocate_memory(); } void allocate_memory() { for(int i = 0; i < 10000; i++) { ptr = malloc(1000); } }
allocate_memory()
ফাংশন মেমরি লিক করবে কারণ এটি malloc
ব্যবহার করছে এবং এটি free
কল করে না সেই স্মৃতি ছেড়ে দিতে।
আপনি এখানে দেখতে পারেন:
`ps -o rss -p #{$$}`.lines.last # "49036" require './extension' `ps -o rss -p #{$$}`.lines.last # "89512"
এই ধরনের লিক কোনো হিপ ডাম্পে বা GC.stat
-এ দেখা যাবে না , কিন্তু আপনি মেমরির ব্যবহার বাড়তে দেখবেন।
সারাংশ
এখন আপনি জানেন যে মেমরি লিক দেখতে কেমন, আশা করি এটি আপনাকে দ্রুত খুঁজে পেতে সাহায্য করবে যদি আপনার কখনও এই সমস্যা হয়। Btw Ruby 2.4.1 এর একটি পরিচিত মেমরি লিক রয়েছে, তাই আপনি যদি এই নির্দিষ্ট সংস্করণটি ব্যবহার করেন তবে আপনি আপগ্রেড করতে চাইতে পারেন৷
আপনার কোন প্রশ্ন, প্রতিক্রিয়া বা একটি আকর্ষণীয় মেমরি লিক ডিবাগিং গল্প আছে? নীচে একটি মন্তব্য দিন 🙂
পড়ার জন্য ধন্যবাদ!