একটি গাদা ডাম্প ক্যাপচার

ক্যাপচারের সময় আপনার অ্যাপের কোন বস্তুগুলি মেমরি ব্যবহার করছে তা দেখতে একটি হিপ ডাম্প ক্যাপচার করুন এবং মেমরি লিক বা মেমরি বরাদ্দকরণ আচরণ শনাক্ত করুন যা তোতলামি, ফ্রিজ এবং এমনকি অ্যাপ ক্র্যাশের দিকে পরিচালিত করে। এটি একটি বর্ধিত ব্যবহারকারীর সেশনের পরে হিপ ডাম্প নেওয়া বিশেষত সহায়ক, যখন এটি মেমরিতে থাকা বস্তুগুলিকে দেখাতে পারে যা আর থাকা উচিত নয়।

এই পৃষ্ঠাটি টুলিংয়ের বর্ণনা করে যা অ্যান্ড্রয়েড স্টুডিও হিপ ডাম্প সংগ্রহ ও বিশ্লেষণ করার জন্য প্রদান করে। বিকল্পভাবে, আপনি dumpsys সহ কমান্ড লাইন থেকে আপনার অ্যাপ মেমরি পরীক্ষা করতে পারেন এবং Logcat-এ আবর্জনা সংগ্রহ (GC) ইভেন্টগুলিও দেখতে পারেন

কেন আপনি আপনার অ্যাপ মেমরি প্রোফাইল করা উচিত

অ্যান্ড্রয়েড একটি পরিচালিত মেমরি পরিবেশ প্রদান করে — যখন অ্যান্ড্রয়েড নির্ধারণ করে যে আপনার অ্যাপ আর কিছু বস্তু ব্যবহার করছে না, তখন আবর্জনা সংগ্রহকারী অব্যবহৃত মেমরিকে আবার গাদা করে ছেড়ে দেয়। অ্যান্ড্রয়েড কীভাবে অব্যবহৃত মেমরি খোঁজার বিষয়ে যায় তা ক্রমাগত উন্নত করা হচ্ছে, কিন্তু সমস্ত অ্যান্ড্রয়েড সংস্করণে কিছু সময়ে, সিস্টেমটিকে আপনার কোডকে সংক্ষিপ্তভাবে বিরতি দিতে হবে। বেশিরভাগ সময়, বিরতিগুলি দুর্বোধ্য হয়। যাইহোক, যদি আপনার অ্যাপটি সিস্টেমটি সংগ্রহ করতে পারে তার চেয়ে দ্রুত মেমরি বরাদ্দ করে, তবে সংগ্রাহক আপনার বরাদ্দ সন্তুষ্ট করার জন্য যথেষ্ট মেমরি মুক্ত করার সময় আপনার অ্যাপটি বিলম্বিত হতে পারে। বিলম্বের কারণে আপনার অ্যাপ ফ্রেমগুলি এড়িয়ে যেতে পারে এবং দৃশ্যমান ধীরগতির কারণ হতে পারে৷

এমনকি আপনার অ্যাপটি ধীরগতির প্রদর্শন না করলেও, যদি এটি মেমরি লিক করে, তবে এটি ব্যাকগ্রাউন্ডে থাকাকালীনও সেই মেমরি ধরে রাখতে পারে। এই আচরণটি অপ্রয়োজনীয় আবর্জনা সংগ্রহের ইভেন্টগুলিকে জোর করে সিস্টেমের বাকি মেমরি কর্মক্ষমতাকে ধীর করে দিতে পারে। অবশেষে, সিস্টেম মেমরি পুনরুদ্ধার করার জন্য আপনার অ্যাপ প্রক্রিয়াটি মেরে ফেলতে বাধ্য হয়। তারপর যখন ব্যবহারকারী আপনার অ্যাপে ফিরে আসবে, অ্যাপ প্রক্রিয়াটি সম্পূর্ণরূপে পুনরায় চালু করতে হবে।

আপনার অ্যাপের মেমরি ব্যবহার কমাতে পারে এমন প্রোগ্রামিং অনুশীলন সম্পর্কে তথ্যের জন্য, আপনার অ্যাপের মেমরি পরিচালনা করুন পড়ুন।

হিপ ডাম্প ওভারভিউ

একটি হিপ ডাম্প ক্যাপচার করতে, একটি হিপ ডাম্প ক্যাপচার করতে মেমরি ব্যবহার বিশ্লেষণ (হিপ ডাম্প) টাস্ক নির্বাচন করুন ( প্রোফাইলার ব্যবহার করুন: ডিবাগেবল (সম্পূর্ণ ডেটা) হিসাবে 'অ্যাপ চালান' )। গাদা ডাম্প করার সময়, জাভা মেমরির পরিমাণ সাময়িকভাবে বাড়তে পারে। এটি স্বাভাবিক কারণ হিপ ডাম্প আপনার অ্যাপের মতো একই প্রক্রিয়ায় ঘটে এবং ডেটা সংগ্রহ করতে কিছু মেমরির প্রয়োজন হয়। আপনি হিপ ডাম্প ক্যাপচার করার পরে, আপনি নিম্নলিখিত দেখতে পাবেন:

ক্লাসের তালিকা নিম্নলিখিত তথ্য দেখায়:

  • বরাদ্দ : গাদা মধ্যে বরাদ্দ সংখ্যা.
  • নেটিভ সাইজ : এই অবজেক্ট টাইপ দ্বারা ব্যবহৃত মোট নেটিভ মেমরি (বাইটে)। আপনি এখানে জাভাতে বরাদ্দ করা কিছু বস্তুর জন্য মেমরি দেখতে পাবেন কারণ অ্যান্ড্রয়েড কিছু ফ্রেমওয়ার্ক ক্লাসের জন্য নেটিভ মেমরি ব্যবহার করে, যেমন Bitmap

  • অগভীর আকার : এই অবজেক্ট টাইপ দ্বারা ব্যবহৃত জাভা মেমরির মোট পরিমাণ (বাইটে)।

  • ধরে রাখা মাপ : এই শ্রেণীর (বাইটে) সমস্ত দৃষ্টান্তের কারণে মেমরির মোট আকার রাখা হচ্ছে।

নির্দিষ্ট হিপে ফিল্টার করতে হিপ মেনু ব্যবহার করুন:

  • অ্যাপ হিপ (ডিফল্ট) : প্রাথমিক হিপ যার উপর আপনার অ্যাপ মেমরি বরাদ্দ করে।
  • ইমেজ হিপ : সিস্টেম বুট ইমেজ, বুট করার সময় আগে থেকে লোড করা ক্লাস ধারণ করে। এখানে বরাদ্দ কখনও সরানো বা দূরে যায় না।
  • জাইগোট হিপ : কপি-অন-রাইট হিপ যেখান থেকে অ্যান্ড্রয়েড সিস্টেমে একটি অ্যাপ প্রসেস ফোর্ক করা হয়।

বরাদ্দ কিভাবে সাজাতে হয় তা চয়ন করতে বিন্যাস ড্রপ-ডাউন ব্যবহার করুন:

  • ক্লাস অনুসারে সাজান (ডিফল্ট) : ক্লাসের নামের উপর ভিত্তি করে সমস্ত বরাদ্দ গ্রুপ করে।
  • প্যাকেজ অনুসারে সাজান : প্যাকেজের নামের উপর ভিত্তি করে সমস্ত বরাদ্দ গ্রুপ করে।

ক্লাসের গ্রুপগুলিতে ফিল্টার করতে ক্লাস ড্রপ-ডাউন ব্যবহার করুন:

  • সমস্ত ক্লাস (ডিফল্ট) : লাইব্রেরি এবং নির্ভরতা সহ সমস্ত ক্লাস দেখায়।
  • অ্যাক্টিভিটি/ফ্র্যাগমেন্ট লিক দেখান : মেমরি লিক হওয়া ক্লাস দেখায়।
  • প্রজেক্ট ক্লাস দেখান : শুধুমাত্র আপনার প্রোজেক্ট দ্বারা সংজ্ঞায়িত ক্লাস দেখায়।

ইনস্ট্যান্স প্যান খুলতে একটি ক্লাসের নামে ক্লিক করুন। তালিকাভুক্ত প্রতিটি উদাহরণ নিম্নলিখিত অন্তর্ভুক্ত:

  • গভীরতা : যেকোন GC রুট থেকে নির্বাচিত দৃষ্টান্ত পর্যন্ত হপগুলির সংক্ষিপ্ত সংখ্যক।
  • নেটিভ সাইজ : নেটিভ মেমরিতে এই উদাহরণের আকার। এই কলামটি শুধুমাত্র Android 7.0 এবং উচ্চতর সংস্করণের জন্য দৃশ্যমান।
  • অগভীর আকার : জাভা মেমরিতে এই উদাহরণের আকার।
  • ধরে রাখা আকার : মেমরির আকার যা এই উদাহরণটি প্রাধান্য দেয় ( ডোমিনেটর ট্রি অনুসারে)।

ইনস্ট্যান্সের বিশদ বিবরণ দেখানোর জন্য একটি উদাহরণে ক্লিক করুন, এর ক্ষেত্র এবং তথ্যসূত্র সহ। সাধারণ ক্ষেত্র এবং রেফারেন্স প্রকারগুলি কাঠামোগত প্রকার , অ্যারে , এবং আদিম তথ্য প্রকার জাভাতে। সোর্স কোডের সংশ্লিষ্ট উদাহরণ বা লাইনে যেতে একটি ক্ষেত্র বা রেফারেন্সে ডান-ক্লিক করুন।

  • ক্ষেত্র : এই উদাহরণে সমস্ত ক্ষেত্র দেখায়।
  • তথ্যসূত্র : ইনস্ট্যান্স ট্যাবে হাইলাইট করা বস্তুর প্রতিটি রেফারেন্স দেখায়।

মেমরি লিক খুঁজুন

মেমরি ফাঁসের সাথে যুক্ত হতে পারে এমন ক্লাসে দ্রুত ফিল্টার করতে, ক্লাস ড্রপ-ডাউন খুলুন এবং কার্যকলাপ/খণ্ড লিক দেখান নির্বাচন করুন। অ্যান্ড্রয়েড স্টুডিও ক্লাসগুলি দেখায় যা এটি মনে করে যে আপনার অ্যাপে Activity এবং Fragment ইনস্ট্যান্সের জন্য মেমরি লিক নির্দেশ করে৷ ফিল্টারটি যে ধরণের ডেটা দেখায় তার মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • Activity দৃষ্টান্ত যা ধ্বংস করা হয়েছে কিন্তু এখনও উল্লেখ করা হচ্ছে।
  • Fragment দৃষ্টান্তগুলির একটি বৈধ FragmentManager নেই কিন্তু এখনও উল্লেখ করা হচ্ছে।

সচেতন থাকুন যে ফিল্টারটি নিম্নলিখিত পরিস্থিতিতে মিথ্যা ইতিবাচক ফল দিতে পারে:

  • একটি Fragment তৈরি করা হয়েছে কিন্তু এখনও ব্যবহার করা হয়নি।
  • একটি Fragment ক্যাশে করা হচ্ছে কিন্তু একটি FragmentTransaction অংশ হিসাবে নয়।

মেমরি ফাঁস আরও ম্যানুয়ালি দেখতে, বড় ধরে রাখা আকারের বস্তুগুলি খুঁজে পেতে ক্লাস এবং উদাহরণ তালিকাগুলি ব্রাউজ করুন। নিম্নলিখিত যে কোনো একটি দ্বারা সৃষ্ট মেমরি লিক জন্য দেখুন:

  • Activity , Context , View , Drawable , এবং অন্যান্য অবজেক্টের দীর্ঘকালের রেফারেন্স যা Activity বা Context কন্টেনারে একটি রেফারেন্স ধারণ করতে পারে।
  • নন-স্ট্যাটিক অভ্যন্তরীণ ক্লাস, যেমন একটি Runnable , যা একটি Activity উদাহরণ ধারণ করতে পারে।
  • ক্যাশে যা প্রয়োজনের চেয়ে বেশি সময় অবজেক্ট ধরে রাখে।

যখন আপনি সম্ভাব্য মেমরি ফাঁস খুঁজে পান, ইনস্ট্যান্স বিবরণে ক্ষেত্র এবং রেফারেন্স ট্যাবগুলি ব্যবহার করুন আগ্রহের উদাহরণ বা উত্স কোড লাইনে যেতে।

পরীক্ষার জন্য মেমরি ফাঁস ট্রিগার

মেমরি ব্যবহার বিশ্লেষণ করতে, আপনার অ্যাপ কোডে জোর দেওয়া উচিত এবং মেমরি লিক জোর করে করার চেষ্টা করা উচিত। আপনার অ্যাপে মেমরি ফাঁসকে উস্কে দেওয়ার একটি উপায় হল গাদা পরিদর্শন করার আগে এটিকে কিছুক্ষণের জন্য চলতে দেওয়া। ফাঁস গাদা মধ্যে বরাদ্দ শীর্ষ পর্যন্ত trickle হতে পারে. যাইহোক, লিক যত ছোট হবে, এটি দেখার জন্য আপনাকে অ্যাপটি চালাতে হবে।

আপনি নিম্নলিখিত উপায়ে একটি মেমরি লিক ট্রিগার করতে পারেন:

  • ডিভাইসটিকে পোর্ট্রেট থেকে ল্যান্ডস্কেপে ঘোরান এবং বিভিন্ন অ্যাক্টিভিটি অবস্থায় থাকা অবস্থায় একাধিকবার আবার ফিরে যান। ডিভাইসটি ঘোরানোর ফলে প্রায়শই একটি অ্যাপ্লিকেশান একটি Activity , Context বা View অবজেক্ট ফাঁস করতে পারে কারণ সিস্টেমটি Activity পুনরায় তৈরি করে, এবং যদি আপনার অ্যাপটি অন্য কোথাও সেই বস্তুগুলির একটির রেফারেন্স ধারণ করে, তবে সিস্টেম এটি আবর্জনা সংগ্রহ করতে পারে না।
  • বিভিন্ন কার্যকলাপ অবস্থায় থাকাকালীন আপনার অ্যাপ এবং অন্য অ্যাপের মধ্যে স্যুইচ করুন। উদাহরণস্বরূপ, হোম স্ক্রিনে নেভিগেট করুন, তারপরে আপনার অ্যাপে ফিরে যান।

একটি হিপ ডাম্প রেকর্ডিং রপ্তানি এবং আমদানি করুন

আপনি প্রোফাইলারে অতীত রেকর্ডিং ট্যাব থেকে একটি হিপ ডাম্প ফাইল রপ্তানি এবং আমদানি করতে পারেন। অ্যান্ড্রয়েড স্টুডিও একটি .hprof ফাইল হিসাবে রেকর্ডিং সংরক্ষণ করে৷

বিকল্পভাবে, jhat এর মত একটি ভিন্ন .hprof ফাইল বিশ্লেষক ব্যবহার করতে, আপনাকে .hprof ফাইলটিকে Android ফরম্যাট থেকে Java SE .hprof ফাইল ফরম্যাটে রূপান্তর করতে হবে। ফাইল ফরম্যাট কনভার্ট করতে, {android_sdk}/platform-tools/ ডিরেক্টরিতে দেওয়া hprof-conv টুল ব্যবহার করুন। দুটি আর্গুমেন্ট সহ hprof-conv কমান্ডটি চালান: আসল .hprof ফাইলের নাম এবং নতুন .hprof ফাইলের নাম সহ রূপান্তরিত .hprof ফাইলটি লেখার স্থান। যেমন:

hprof-conv heap-original.hprof heap-converted.hprof