একটি অ্যাপে বিটম্যাপ প্রায়শই সবচেয়ে বেশি মেমরি ব্যবহারকারী অবজেক্ট হয়ে থাকে। ফ্রেম রেন্ডারিংয়ের জন্য ডিকোডিং এবং স্কেলিং অপারেশনগুলো প্রায়শই অত্যন্ত গুরুত্বপূর্ণ ভূমিকা পালন করে। বিটম্যাপের মেমরি ব্যবহার অপ্টিমাইজ করার মাধ্যমে জ্যাঙ্ক, এএনআর (ANR) এবং ওওএম (OOM) সম্পর্কিত প্রসেস কিল কমানো যায়, যা ইউআই (UI) রেসপন্সিভনেস, ব্যাটারি লাইফ এবং সার্বিক স্থিতিশীলতায় উল্লেখযোগ্য উন্নতি ঘটায়।
উচ্চ বিটম্যাপ মেমরি ব্যবহার শনাক্ত করুন
অ্যান্ড্রয়েড ভাইটালস অ্যান্ড্রয়েড ডিভাইসগুলো থেকে ডেটা একত্রিত করে একটি অ্যাপের বিটম্যাপ মেমরি ফুটপ্রিন্টের মেট্রিক্স প্রদান করে। এই মেট্রিক্সগুলোর মধ্যে প্রতিটি প্যাকেজ এবং প্রসেসের জন্য নির্দিষ্ট সময়কাল-ভিত্তিক (যেমন, ২৮-দিনের) পার্সেন্টাইল অন্তর্ভুক্ত থাকে। এই ডেটা বিভিন্ন ধরনের ও সংস্করণের ডিভাইসে মেমরি দক্ষতার প্রবণতা এবং সম্ভাব্য অবনতি শনাক্ত করতে সাহায্য করে।
অ্যান্ড্রয়েড ভাইটালস আপনার অ্যাপের বিটম্যাপ মেমরি ব্যবহারের তথ্য নিম্নলিখিত প্রসেস স্টেট অনুযায়ী বিভক্ত করে শেয়ার করে:
- ফোরগ্রাউন্ড : অ্যাপটির প্রসেস দৃশ্যমান থাকে। অন্যান্য প্রসেস স্টেটের তুলনায় ফোরগ্রাউন্ডে P99 উল্লেখযোগ্যভাবে বেশি হবে বলে আশা করা হয়, কিন্তু ডেভেলপারদের খতিয়ে দেখা উচিত যে P99/P50 অনুপাতটি উল্লেখযোগ্য কিনা (যেমন ৩.৫x-এর বেশি), কারণ এটি প্রায়শই একটি বিটম্যাপ মেমরি লিকের দিকে ইঙ্গিত করে। সাধারণ ব্যবহার (P50) এবং অস্বাভাবিক ব্যবহার (P99)-এর মধ্যে পার্থক্য দেখে আপনি এটি শনাক্ত করতে পারেন; যেখানে সাধারণ অ্যাসেট ব্লোট সমস্ত পার্সেন্টাইল জুড়ে মেমরিকে সমানভাবে বাড়িয়ে তোলে, সেখানে মেমরি লিক সময়ের সাথে সাথে বাড়তে থাকে, যা শেষের দিকের ডেটাকে (P99) ব্যাপকভাবে প্রভাবিত করে। নিশ্চিত করুন যে অ্যাপটি অন্য স্টেটে স্থানান্তরিত হওয়ার পরেও ফোরগ্রাউন্ড বিটম্যাপ অ্যালোকেশনগুলো অপ্রয়োজনীয়ভাবে থেকে না যায়।
- ব্যবহারকারী-উপলব্ধ পরিষেবা : অ্যাপের প্রসেসটি একটি উপলব্ধিযোগ্য অবস্থায় চলছে। এর মধ্যে ফোরগ্রাউন্ড পরিষেবা , ত্বরান্বিত কাজ এবং ব্যবহারকারী-প্রবর্তিত ডেটা স্থানান্তর কাজ অন্তর্ভুক্ত। এই অবস্থাগুলিতে যাওয়ার সময় অ্যাপগুলির ভারী ফোরগ্রাউন্ড বিটম্যাপ অ্যালোকেশন ধরে রাখা উচিত নয়। যেহেতু এই পরিষেবাগুলি দীর্ঘ সময় ধরে চলা কাজের জন্য ডিজাইন করা হয়েছে, তাই বড় অ্যাসেট ধরে রাখলে সামগ্রিক ব্যবহারকারীর অভিজ্ঞতা খারাপ হয় এবং লো মেমোরি কিলার ডেমন (LMKD)-কে কম অগ্রাধিকারের প্রসেস বন্ধ করে মেমোরি পুনরুদ্ধার করতে বাধ্য করে।
- ব্যাকগ্রাউন্ড : অ্যাপটি একটি ব্যাকগ্রাউন্ড সার্ভিস চালাচ্ছে, অথবা সম্প্রতি ব্যাকগ্রাউন্ডে পাঠানো হয়েছিল, কিন্তু এখনও ক্যাশ করা হয়নি। যেহেতু এই প্রসেসের অবস্থা ফোরগ্রাউন্ড বা দৃশ্যমান প্রসেসগুলোর চেয়ে কম গুরুত্বপূর্ণ, তাই মেমোরির চাপ কমাতে অ্যাপগুলোর উচিত এখানে বড় বিটম্যাপ অ্যাসেটগুলো স্পষ্টভাবে রিলিজ করা।
- ক্যাশড : অ্যাপটি একটি ক্যাশড অবস্থায় আছে। এই অবস্থাটি সিস্টেম মেমরির চাপের (যেমন LMK) প্রতি অত্যন্ত সংবেদনশীল। OS দ্বারা অপসারণ এড়াতে অ্যাপগুলোকে অবশ্যই এই অবস্থায় সক্রিয়ভাবে বিটম্যাপ মেমরির ব্যবহার কমাতে হবে।
উচ্চ বিটম্যাপ মেমরি ব্যবহারের কারণসমূহ
যে ভার্চুয়াল মেমরি কখনও ব্যবহার করা হয়নি, সেটিও গণনার অন্তর্ভুক্ত হতে পারে। যদি আপনি অপ্রত্যাশিতভাবে বেশি বিটম্যাপ মেমরি ব্যবহার দেখতে পান, তবে যাচাই করুন যে আপনি অব্যবহৃত মেমরি বরাদ্দ করছেন না।
সম্পদ
অ্যান্ড্রয়েড স্টুডিওতে বিটম্যাপ বিশ্লেষণ করুন
বিটম্যাপের জন্য অ্যান্ড্রয়েড স্টুডিও প্রোফাইলিং
রিয়েল-টাইমে মেমরি অ্যালোকেশন পরীক্ষা করতে, হিপ ডাম্প ক্যাপচার করতে এবং মেমরি লিকের জন্য অবজেক্ট বিশ্লেষণ করতে মেমরি প্রোফাইলার ব্যবহার করুন; এছাড়াও, মেমরি লিক শনাক্ত করতে, ডুপ্লিকেট বিটম্যাপ অ্যালোকেশন চিহ্নিত করতে এবং অবজেক্ট রিটেনশন ভিজ্যুয়ালাইজ করতে হিপ অ্যানালাইজার ব্যবহার করুন।
LeakCanary-এর সাহায্যে স্বয়ংক্রিয় লিক সনাক্তকরণ
আপনার অ্যাপে মেমরি লিক সনাক্তকরণ স্বয়ংক্রিয় করতে LeakCanary লাইব্রেরিটি ইন্টিগ্রেট করুন। LeakCanary স্বয়ংক্রিয়ভাবে হিপ বিশ্লেষণ করে এমন অবজেক্ট সনাক্ত করে, যেগুলো গার্বেজ কালেক্ট হয়ে যাওয়ার কথা থাকলেও এখনও মেমরিতে রয়ে গেছে; যেমন, ধ্বংস হয়ে যাওয়া অ্যাক্টিভিটি বা ফ্র্যাগমেন্ট দ্বারা ধরে রাখা বিটম্যাপ।
বিটম্যাপ পারফরম্যান্স ডকুমেন্টেশন
এই রিসোর্সগুলো বিভিন্ন অ্যান্ড্রয়েড কম্পোনেন্ট জুড়ে কার্যকর বিটম্যাপ হ্যান্ডলিংয়ের সেরা অনুশীলন সম্পর্কে বিস্তারিত নির্দেশনা প্রদান করে।
বিটম্যাপ মেমরি ব্যবহার অপ্টিমাইজ করার জন্য ডেভেলপার চেকলিস্ট
বিটম্যাপ মেমরির কার্যকারিতা সর্বোত্তম করতে তিনটি মূল নীতি অনুসরণ করুন: হ্রাস, পুনঃব্যবহার এবং পুনর্ব্যবহার।
- রিডিউস : বিটম্যাপ লোড বা প্রদর্শন করার সময় প্রাথমিক মেমরি ব্যবহার হ্রাস করুন।
- পুনঃব্যবহার : অপ্রয়োজনীয় বিটম্যাপ বরাদ্দ এড়াতে ক্যাশিং ব্যবস্থা প্রয়োগ করুন।
- রিসাইকেল : সক্রিয় প্রসেসগুলোর জন্য মেমরি পুনঃবরাদ্দের সুযোগ করে দিতে স্বতঃপ্রণোদিতভাবে রিসোর্স মুক্ত করা।
নিম্নলিখিত ডেভেলপার চেকলিস্টটি আপনাকে বিটম্যাপ মেমরি ব্যবহার অপ্টিমাইজ করতে সাহায্য করতে পারে।
| মূল নীতি | এলাকা | বর্ণনা |
|---|---|---|
| হ্রাস করুন | ডুপ্লিকেট বিটম্যাপগুলি বাদ দিন | অপ্রয়োজনীয় বিটম্যাপ অ্যালোকেশন শনাক্ত করতে মেমরি প্রোফাইলার ব্যবহার করে হিপ ডাম্প বিশ্লেষণ করুন। ‘বিটম্যাপ মেমরি ব্যবস্থাপনা’ নির্দেশিকাটি দেখুন। |
| ইমেজ লোডিং লাইব্রেরি ব্যবহার করুন | থ্রেডিং, ক্যাশিং এবং কার্যকর ডিকোডিং স্বয়ংক্রিয় করতে Glide এবং Coil-এর মতো লাইব্রেরি ব্যবহার করুন। | |
| ডাউনস্যাম্পলিং বাস্তবায়ন করুন | সম্পূর্ণ রেজোলিউশনের অ্যাসেট লোড করার পরিবর্তে, ছবিগুলোকে টার্গেট UI কন্টেইনারের ডাইমেনশনের সাথে মেলানোর জন্য ডিকোড করুন । | |
| অস্বচ্ছ ছবির জন্য RGB_565 ব্যবহার করুন | স্বচ্ছতাহীন ছবির ক্ষেত্রে ARGB_8888 থেকে ১৬-বিট কনফিগারেশনে পরিবর্তন করে মেমোরি ফুটপ্রিন্ট ৫০% কমান। | |
| VectorDrawables-কে অগ্রাধিকার দিন | আইকন এবং সাধারণ গ্রাফিক্সের জন্য ভেক্টর ব্যবহার করলে তা নিখুঁত স্কেলিং নিশ্চিত করে এবং মেমোরি খরচও কমায়। | |
| সার্ভার-সাইড ইমেজ ডেলিভারি অপ্টিমাইজ করুন | ডিভাইসের ঘনত্ব এবং ImageView-এর মাত্রা অনুযায়ী ছবি পরিবেশন করার জন্য ব্যাকএন্ড API কনফিগার করুন। | |
| স্বচ্ছ প্রান্তগুলি বাদ দিন | বিল্ট-ইন মার্জিনের পরিবর্তে InsetDrawable বা লেআউট প্যাডিং ব্যবহার করে "অদৃশ্য" পিক্সেলের জন্য মেমরি বরাদ্দ করা এড়িয়ে চলুন। মেমরি-পারফর্ম্যান্ট অ্যান্ড্রয়েড অ্যাপস ইঞ্জিনিয়ারিং দেখুন। | |
| পুনঃব্যবহার | সর্বোত্তম ক্যাশে আকার কনফিগার করুন | ডিভাইসের র্যাম এবং স্ক্রিন রেজোলিউশনের উপর ভিত্তি করে মেমরি ও ডিস্ক ক্যাশের সীমা নির্ধারণ করুন। এর জন্য ‘ক্যাশিং বিটম্যাপস’ অংশটি দেখুন। |
| পুনর্ব্যবহার করুন | পটভূমিতে সম্পদ শুদ্ধ করুন | সিস্টেম মেমরির উপর চাপ চলাকালীন ক্যাশে পরিষ্কার করতে এবং প্রসেসের টিকে থাকা উন্নত করতে TRIM_MEMORY_BACKGROUND প্রয়োগ করুন । |
| UI লুকানো থাকলে অ্যাসেটগুলি রিলিজ করুন | যখন অ্যাপটি ব্যবহারকারীর কাছে আর দৃশ্যমান থাকে না, তখন বিটম্যাপ ক্যাশ মুক্ত করতে TRIM_MEMORY_UI_HIDDEN ব্যবহার করুন । | |
| মেমরি লিক নিরীক্ষণ করুন | যেসব বিটম্যাপের LifecycleOwner ধ্বংস হয়ে যাওয়ার পরেও থেকে যায়, সেগুলো খুঁজে বের করতে LeakCanary এবং Memory Profiler ব্যবহার করুন। আপনার অ্যাপের মেমরি পরিচালনা (Manage your app's memory) অংশটি দেখুন। |