হিপ ডাম্প ক্যাপচার করুন

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

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

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

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

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

প্রোগ্রামিং সংক্রান্ত প্র্যাক্টিস সম্পর্কে তথ্যের জন্য, যা আপনার অ্যাপের মেমরি ব্যবহার কমাতে পারে, [আপনার অ্যাপের মেমরি ম্যানেজ করুন]মেমরি পড়ুন।

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

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

Android Studio Profiler-এ হিপ ডাম্প ভিউ।

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

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

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

  • রেখে দেওয়া সাইজ: এই ক্লাসের সব ইনস্ট্যান্সের জন্য রেখে দেওয়া মেমরির মোট সাইজ (বাইটে)।

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

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

অ্যালোকেশন কীভাবে সাজাবেন তা বেছে নিতে, সাজানোর ড্রপ-ডাউন ব্যবহার করুন:

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

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

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

ইনস্ট্যান্স প্যান খুলতে কোনও ক্লাসের নামে ক্লিক করুন। তালিকাভুক্ত প্রতিটি ইনস্ট্যান্সে নিম্নলিখিত তথ্য অন্তর্ভুক্ত থাকে:

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

ইনস্ট্যান্সের বিবরণ দেখতে কোনও ইনস্ট্যান্সে ক্লিক করুন, এর মধ্যে ফিল্ড এবং রেফারেন্স অন্তর্ভুক্ত। সাধারণ ফিল্ড ও রেফারেন্সের ধরন হল স্ট্রাকচার্ড ধরন , অ্যারে , এবং Java-তে প্রিমিটিভ ডেটার ধরন। সোর্স কোডে সংশ্লিষ্ট ইনস্ট্যান্স বা লাইনে যেতে কোনও ফিল্ড বা রেফারেন্সে ডানদিকের বোতামে ক্লিক করুন।

  • ফিল্ড: এই ইনস্ট্যান্সের সব ফিল্ড দেখায়।
  • রেফারেন্স: ইনস্ট্যান্স ট্যাবে হাইলাইট করা অবজেক্টের প্রতিটি রেফারেন্স দেখায়।
হিপ ডাম্প টুল উইন্ডোতে ইনস্ট্যান্স, ফিল্ড ও রেফারেন্স ভিউ।

ডুপ্লিকেট বিটম্যাপ শনাক্ত করুন

এছাড়াও, আপনি Android Studio Narwhal 4 থেকে শুরু করে হিপ ডাম্প ভিউতে অপ্রয়োজনীয় বিটম্যাপ শনাক্ত করতে পারবেন।

কীভাবে তাদের খুঁজে বের করবেন তা এখানে দেওয়া হল:

  1. Android Studio-তে প্রোফাইলার ট্যাব খুলুন
  2. হিপ ডাম্প (বা মেমরির ব্যবহার বিশ্লেষণ করুন) বিকল্পে ক্লিক করুন এবং আপনার অ্যাপের বর্তমান মেমরি অবস্থার স্ন্যাপশট নিতে রেকর্ড করুন বিকল্পে ক্লিক করুন।
  3. হলুদ রঙের সতর্কতামূলক ত্রিভুজ ⚠️-এর জন্য বিশ্লেষণের ফলাফল স্ক্যান করুন, যা Android Studio একাধিকবার স্টোর করা ডুপ্লিকেট বিটম্যাপ ফ্ল্যাগ করতে ব্যবহার করে।
    • বিকল্প হিসেবে, প্রোফাইলার হেডারে গিয়ে এর মাধ্যমে ফিল্টার করুন: বিকল্প বেছে নিন এবং ডুপ্লিকেট বিটম্যাপ সেটিং বেছে নিন।
  4. বিটম্যাপ প্রিভিউ প্যানেল খুলতে ফ্ল্যাগ করা যেকোনও এন্ট্রিতে ক্লিক করুন, এর ফলে আপনি ঠিক কোন ছবিটি বারবার নীতি লঙ্ঘন করছে তা দেখতে পাবেন।
  5. আপনার কোডে অপ্রয়োজনীয় লোডিং লজিক ট্র্যাক করতে এবং আরও ভালো ক্যাশিং স্ট্র্যাটেজি প্রয়োগ করতে সেই ভিজ্যুয়াল কনফার্মেশন ব্যবহার করুন।
হলুদ রঙের সতর্কতামূলক ত্রিভুজ ⚠️ ব্যবহার করে ডুপ্লিকেট বিটম্যাপ খুঁজুন।

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

মেমরি লিকের সাথে যুক্ত থাকতে পারে এমন ক্লাস দ্রুত ফিল্টার করতে, ক্লাস ড্রপ-ডাউন খুলুন এবং অ্যাক্টিভিটি/ফ্র্যাগমেন্ট লিক দেখুন বিকল্প বেছে নিন। Android Studio এমন ক্লাস দেখায় যা মনে করে যে আপনার অ্যাপে Activity এবং Fragment ইনস্ট্যান্সের জন্য মেমরি লিক নির্দেশ করে।

ম্যানুয়ালি মেমরি লিক খুঁজতে, ক্লাস ও ইনস্ট্যান্স তালিকা ব্রাউজ করে বড় রেখে দেওয়া সাইজ সহ অবজেক্ট খুঁজুন। নিম্নলিখিত যেকোনও কারণে হওয়া মেমরি লিক খুঁজুন:

  • Activity বা Context-এর দীর্ঘস্থায়ী রেফারেন্স যা হোস্ট করা Compose কম্পোজিশন গ্রাফ (যেমন ComposeView এবং এর সাব-কম্পোজেবল) ফাঁস করতে পারে।
  • Jetpack Compose স্টেট অবজেক্ট (MutableState), স্টেট হোল্ডার বা ল্যাম্বডা যা Context ক্যাপচার করে, সেগুলি লিক করা।
  • DisposableEffect-এর onDispose ব্লকে লিসেনার বা অবজারভার ক্লিন-আপ করতে ভুলে যাওয়া।
  • নন-স্ট্যাটিক ইনার ক্লাস, যেমন Runnable, যা Activity ইনস্ট্যান্স ধরে রাখতে পারে।
  • প্রয়োজনের চেয়ে বেশি সময় ধরে অবজেক্ট ধরে রাখে এমন ক্যাশে।

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

পরীক্ষার জন্য মেমরি লিক ট্রিগার করে

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

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

  • বিভিন্ন অ্যাক্টিভিটি স্ট্যাটাসে থাকাকালীন ডিভাইসটি পোর্ট্রেট থেকে ল্যান্ডস্কেপ মোডে এবং আবার পোর্ট্রেট মোডে একাধিকবার ঘোরান। ডিভাইস রোটেট করলে, প্রায়ই কোনও অ্যাপের Activity (এবং ফলস্বরূপ এটির হোস্ট করা Compose UI ট্রি এবং সংশ্লিষ্ট স্টেট ট্রি) লিক হতে পারে, যদি আপনার অ্যাপ অ্যাসিঙ্ক্রোনাস অপারেশন বা স্টেট হোল্ডারের মধ্যে Activity বা Context-এর রেফারেন্স ধরে রাখে।
  • বিভিন্ন অ্যাক্টিভিটি স্ট্যাটাসে থাকাকালীন আপনার অ্যাপ এবং অন্য অ্যাপের মধ্যে পরিবর্তন করুন। যেমন, হোম স্ক্রিনে নেভিগেট করে, তারপর আপনার অ্যাপে ফিরে যান।

হিপ ডাম্প রেকর্ডিং এক্সপোর্ট ও ইমপোর্ট করা

আপনি প্রোফাইলারের আগের রেকর্ডিং ট্যাব থেকে হিপ ডাম্প ফাইল এক্সপোর্ট ও ইমপোর্ট করতে পারবেন। Android Studio রেকর্ডিংটি .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

অতিরিক্ত রিসোর্স