এই ডকুমেন্টটি ধরে নেয় যে আপনি অ্যান্ড্রয়েড অ্যাপের মেমরি ম্যানেজমেন্টের জন্য সেরা অনুশীলন নির্দেশিকা অনুসরণ করেছেন, যেমন ' আপনার অ্যাপের মেমরি পরিচালনা করুন '।
ভূমিকা
মেমরি লিক হলো এক ধরনের রিসোর্স লিক, যা তখন ঘটে যখন কোনো কম্পিউটার প্রোগ্রাম বরাদ্দকৃত অপ্রয়োজনীয় মেমরি মুক্ত করে না। এই লিকের কারণে অ্যাপ্লিকেশনটি অপারেটিং সিস্টেমের কাছে তার উপলব্ধ মেমরির চেয়ে বেশি মেমরি চাইতে পারে, যার ফলে অ্যাপ্লিকেশনটি ক্র্যাশ করে। অ্যান্ড্রয়েড অ্যাপে বেশ কিছু অনুপযুক্ত অভ্যাসের কারণে মেমরি লিক হতে পারে, যেমন রিসোর্স সঠিকভাবে ডিসপোজ না করা অথবা অপ্রয়োজনীয় লিসেনার আনরেজিস্টার না করা।
এই ডকুমেন্টটি আপনার কোডে মেমরি লিক প্রতিরোধ, শনাক্ত এবং সমাধান করার জন্য কিছু সেরা পদ্ধতি প্রদান করে। আপনি যদি এই ডকুমেন্টের পদ্ধতিগুলো চেষ্টা করার পরেও আমাদের SDK-গুলোতে মেমরি লিকের সন্দেহ করেন, তাহলে “How to report issues with Google SDKs” দেখুন।
সাপোর্টের সাথে যোগাযোগ করার আগে
গুগল সাপোর্ট টিমের কাছে মেমোরি লিকের বিষয়ে রিপোর্ট করার আগে, ত্রুটিটি আপনার কোডে নেই তা নিশ্চিত করতে এই ডকুমেন্টে দেওয়া ডিবাগিং ধাপগুলোর সাথে সেরা অনুশীলনগুলো অনুসরণ করুন। এই পদক্ষেপগুলো আপনার সমস্যার সমাধান করতে পারে, এবং যদি তা না-ও হয়, তবে এগুলো এমন তথ্য তৈরি করে যা আপনাকে সাহায্য করার জন্য গুগল সাপোর্ট টিমের প্রয়োজন হবে।
মেমরি লিক প্রতিরোধ করুন
গুগল এসডিকে ব্যবহারকারী কোডে মেমরি লিকের কয়েকটি সাধারণ কারণ এড়াতে এই সেরা অনুশীলনগুলো অনুসরণ করুন।
অ্যান্ড্রয়েড অ্যাপের জন্য সেরা অনুশীলন
আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশনে আপনি নিম্নলিখিত সবগুলি কাজ করেছেন কিনা তা যাচাই করুন:
- অব্যবহৃত সম্পদ মুক্ত করুন ।
- প্রয়োজন ফুরিয়ে গেলে লিসেনারগুলো অনিবন্ধিত করুন ।
- অপ্রয়োজনে কাজগুলো বাতিল করুন ।
- রিসোর্স মুক্ত করার জন্য ফরোয়ার্ড লাইফসাইকেল পদ্ধতি ।
- SDK-গুলোর সর্বশেষ সংস্করণ ব্যবহার করুন ।
- ANR প্রতিরোধ করতে ইনিশিয়ালাইজেশনের সময় প্রধান থ্রেডকে ব্লক করা থেকে বিরত থাকুন ।
এই অনুশীলনগুলোর প্রত্যেকটির নির্দিষ্ট বিবরণের জন্য নিম্নলিখিত বিভাগগুলো দেখুন।
অব্যবহৃত সম্পদ মুক্ত করুন
আপনার অ্যান্ড্রয়েড অ্যাপ যখন কোনো রিসোর্স ব্যবহার করে, তখন সেটির আর প্রয়োজন না থাকলে অবশ্যই রিসোর্সটি রিলিজ করে দিন। যদি আপনি তা না করেন, তাহলে আপনার অ্যাপ্লিকেশনের কাজ শেষ হয়ে যাওয়ার পরেও রিসোর্সটি মেমোরি দখল করে রাখে। আরও তথ্যের জন্য, অ্যান্ড্রয়েড ডকুমেন্টেশনে 'The activity lifecycle' অংশটি পর্যালোচনা করুন।
GeoSDK-গুলিতে অপ্রচলিত GoogleMap রেফারেন্সগুলি রিলিজ করুন
একটি সাধারণ ভুল হলো, NavigationView বা MapView ব্যবহার করে ক্যাশ করা হলে একটি GoogleMap মেমোরি লিকের কারণ হতে পারে। একটি GoogleMap-এর সাথে সেই NavigationView বা MapView-এর একটি ১:১ সম্পর্ক থাকে যেখান থেকে এটি নেওয়া হয়। আপনাকে অবশ্যই নিশ্চিত করতে হবে যে GoogleMap ক্যাশ করা নেই, অথবা NavigationView#onDestroy বা MapView#onDestroy কল করার সময় রেফারেন্সটি রিলিজ করা হয়েছে। যদি NavigationSupportFragment, MapSupportFragment, বা এই ভিউগুলোকে ঘিরে থাকা আপনার নিজস্ব ফ্র্যাগমেন্ট ব্যবহার করেন, তাহলে Fragment#onDestroyView-তে রেফারেন্সটি অবশ্যই রিলিজ করতে হবে।
class NavFragment : SupportNavigationFragment() {
var googleMap: GoogleMap?
override fun onCreateView(
inflater: LayoutInflater,
parent: ViewGroup?,
savedInstanceState: Bundle?,
): View {
super.onCreateView(inflater,parent,savedInstanceState)
getMapAsync{map -> googleMap = map}
}
override fun onDestroyView() {
googleMap = null
}
}
প্রয়োজন ফুরিয়ে গেলে লিসেনারদের নিবন্ধন বাতিল করুন।
যখন আপনার অ্যান্ড্রয়েড অ্যাপ কোনো ইভেন্টের জন্য, যেমন একটি বোতামে ক্লিক বা কোনো ভিউ-এর অবস্থার পরিবর্তনের জন্য, একটি লিসেনার রেজিস্টার করে, তখন অ্যাপ্লিকেশনটির আর ইভেন্টটি পর্যবেক্ষণ করার প্রয়োজন না হলে লিসেনারটি আনরেজিস্টার করতে ভুলবেন না। যদি আপনি তা না করেন, তাহলে আপনার অ্যাপ্লিকেশনটির কাজ শেষ হয়ে যাওয়ার পরেও লিসেনারগুলো মেমরি দখল করে রাখবে।
উদাহরণস্বরূপ, ধরুন আপনার অ্যাপ্লিকেশনটি নেভিগেশন SDK ব্যবহার করে এবং এটি আগমন ইভেন্ট শোনার জন্য addArrivalListener মেথডটি কল করে; যখন আগমন ইভেন্টগুলো পর্যবেক্ষণ করার আর প্রয়োজন হয় না, তখন এটির removeArrivalListener কল করা উচিত।
var arrivalListener: Navigator.ArrivalListener? = null
fun registerNavigationListeners() {
arrivalListener =
Navigator.ArrivalListener {
...
}
navigator.addArrivalListener(arrivalListener)
}
override fun onDestroy() {
navView.onDestroy()
if (arrivalListener != null) {
navigator.removeArrivalListener(arrivalListener)
}
...
super.onDestroy()
}
অপ্রয়োজনে কাজগুলো বাতিল করুন
যখন একটি অ্যান্ড্রয়েড অ্যাপ কোনো অ্যাসিঙ্ক্রোনাস টাস্ক, যেমন একটি ডাউনলোড বা নেটওয়ার্ক রিকোয়েস্ট, শুরু করে, তখন সেটি শেষ হলে টাস্কটি বাতিল করে দিন। যদি টাস্কটি বাতিল না করা হয়, তবে অ্যাপটির কাজ শেষ হয়ে যাওয়ার পরেও এটি ব্যাকগ্রাউন্ডে চলতে থাকে।
সর্বোত্তম অনুশীলন সম্পর্কে আরও বিস্তারিত জানতে, অ্যান্ড্রয়েড ডকুমেন্টেশনে 'আপনার অ্যাপের মেমরি পরিচালনা করুন' অংশটি দেখুন।
রিসোর্স মুক্ত করার জন্য ফরোয়ার্ড লাইফসাইকেল পদ্ধতি
আপনার অ্যাপ যদি নেভিগেশন বা ম্যাপস এসডিকে ব্যবহার করে, তাহলে লাইফসাইকেল মেথডগুলো (বোল্ড অক্ষরে দেখানো) navView তে ফরওয়ার্ড করে রিসোর্সগুলো রিলিজ করা নিশ্চিত করুন। আপনি নেভিগেশন এসডিকে-তে থাকা NavigationView অথবা ম্যাপস বা নেভিগেশন এসডিকে-তে থাকা MapView ব্যবহার করে এটি করতে পারেন। এছাড়াও, আপনি যথাক্রমে সরাসরি NavigationView এবং MapView ব্যবহার করার পরিবর্তে SupportNavigationFragment বা SupportMapFragment ব্যবহার করতে পারেন। সাপোর্ট ফ্র্যাগমেন্টগুলোই লাইফসাইকেল মেথডগুলো ফরওয়ার্ড করার কাজটি পরিচালনা করে।
class NavViewActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
navView = ...
navView.onCreate(savedInstanceState)
...
}
override fun onSaveInstanceState(savedInstanceState: Bundle) {
super.onSaveInstanceState(savedInstanceState)
navView.onSaveInstanceState(savedInstanceState)
}
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
navView.onTrimMemory(level)
}
/* Same with
override fun onStart()
override fun onResume()
override fun onPause()
override fun onConfigurationChanged(...)
override fun onStop()
override fun onDestroy()
*/
}
SDK-গুলোর সর্বশেষ সংস্করণ ব্যবহার করুন
গুগল এসডিকে-গুলো ক্রমাগত নতুন ফিচার, বাগ ফিক্স এবং পারফরম্যান্সের উন্নতি দিয়ে আপডেট করা হচ্ছে। এই ফিক্সগুলো পেতে আপনার অ্যাপের এসডিকে-গুলো আপ-টু-ডেট রাখুন।
ANR প্রতিরোধ করতে ইনিশিয়ালাইজেশনের সময় প্রধান থ্রেডকে ব্লক করা এড়িয়ে চলুন।
যখন কোনো অ্যাপ দীর্ঘ সময়ের জন্য মেইন থ্রেডকে ব্লক করে রাখে, তখন এটি "অ্যাপ্লিকেশন সাড়া দিচ্ছে না" (ANR) ত্রুটির কারণ হতে পারে। ANR প্রতিরোধ করতে, দীর্ঘ সময় ধরে চলা কাজগুলোকে ডিফার করে বা মেইন থ্রেডের বাইরে চালিয়ে onCreate() এর মতো লাইফসাইকেল মেথডগুলোকে যথাসম্ভব লাইটওয়েট রাখুন।
SDK প্রারম্ভিককরণ সম্পর্কিত ANR এড়াতে:
- একবারে শুধুমাত্র একটি ম্যাপ ইনস্ট্যান্স তৈরি করুন।
- ম্যাপ ইনস্ট্যানশিয়েট করার সময় UI থ্রেডের কাজ যতটা সম্ভব কমিয়ে আনুন।
মেমরি লিক ডিবাগ করুন
এই ডকুমেন্টের পূর্ববর্তী অংশে উল্লিখিত সমস্ত প্রযোজ্য পরামর্শ বাস্তবায়নের পরেও যদি আপনি মেমরি লিক দেখতে পান, তবে ডিবাগ করার জন্য এই প্রক্রিয়াটি অনুসরণ করুন।
শুরু করার আগে , অ্যান্ড্রয়েড কীভাবে মেমরি পরিচালনা করে সে সম্পর্কে আপনার ধারণা থাকা উচিত। এ বিষয়ে তথ্যের জন্য, অ্যান্ড্রয়েডের মেমরি ব্যবস্থাপনার সংক্ষিপ্ত বিবরণটি পড়ুন।
মেমরি লিক ডিবাগ করতে, এই প্রক্রিয়াটি অনুসরণ করুন:
- সমস্যাটি পুনরায় তৈরি করুন । ডিবাগ করার জন্য এই ধাপটি অপরিহার্য।
- মেমরি ব্যবহার প্রত্যাশিত কিনা তা পরীক্ষা করুন । যে অতিরিক্ত ব্যবহারকে মেমরি লিক বলে মনে হচ্ছে, তা আসলে আপনার অ্যাপ্লিকেশনটি চালানোর জন্য প্রয়োজনীয় মেমরি নয়, তা যাচাই করুন।
- উচ্চ-স্তরে ডিবাগ করুন । ডিবাগ করার জন্য আপনি বেশ কিছু ইউটিলিটি ব্যবহার করতে পারেন। অ্যান্ড্রয়েডে মেমরি সংক্রান্ত সমস্যা ডিবাগ করতে তিনটি ভিন্ন স্ট্যান্ডার্ড টুল সেট সাহায্য করে: অ্যান্ড্রয়েড স্টুডিও, পারফেটটো এবং অ্যান্ড্রয়েড ডিবাগ ব্রিজ (adb) কমান্ড লাইন ইউটিলিটি।
- আপনার অ্যাপের মেমরি ব্যবহার পরীক্ষা করুন । একটি হিপ ডাম্প ও অ্যালোকেশন ট্র্যাকিং সংগ্রহ করে তা বিশ্লেষণ করুন।
- মেমরি লিক ঠিক করুন ।
পরবর্তী অধ্যায়গুলোতে এই ধাপগুলো বিস্তারিতভাবে আলোচনা করা হয়েছে।
ধাপ ১: সমস্যাটি পুনরায় তৈরি করুন
আপনি যদি সমস্যাটি পুনরায় তৈরি করতে না পারেন, তাহলে প্রথমে সেই পরিস্থিতিগুলো বিবেচনা করুন যা মেমোরি লিকের কারণ হতে পারে। যদি আপনি নিশ্চিত হন যে সমস্যাটি পুনরায় তৈরি হয়েছে, তবে সরাসরি হিপ ডাম্প পরীক্ষা করলে কাজ হতে পারে। কিন্তু, যদি আপনি শুধু অ্যাপ চালুর সময় বা অন্য কোনো এলোমেলো সময়ে একটি হিপ ডাম্প পান, তাহলে সম্ভবত আপনি লিক ঘটানোর মতো পরিস্থিতি তৈরি করেননি। সমস্যাটি পুনরায় তৈরি করার চেষ্টা করার সময় বিভিন্ন পরিস্থিতি খতিয়ে দেখার কথা বিবেচনা করুন:
কোন কোন বৈশিষ্ট্য সক্রিয় করা হয়েছে?
ব্যবহারকারীর ঠিক কোন ধারাবাহিক কার্যকলাপ এই তথ্য ফাঁসের কারণ হয়?
- আপনি কি এই ক্রমটি সক্রিয় করার একাধিকবার চেষ্টা করেছেন?
অ্যাপটি কোন কোন জীবনচক্রের পর্যায় অতিক্রম করেছে?
- আপনি কি বিভিন্ন লাইফসাইকেল স্টেটের মধ্য দিয়ে একাধিকবার পুনরাবৃত্তি করে দেখেছেন?
নিশ্চিত করুন যে আপনি SDK-গুলোর সর্বশেষ সংস্করণে সমস্যাটি পুনরায় তৈরি করতে পারছেন। পূর্ববর্তী সংস্করণের সমস্যাটি হয়তো ইতিমধ্যেই সমাধান করা হয়ে গেছে।
ধাপ ২: অ্যাপটির মেমরি ব্যবহার প্রত্যাশিত কিনা তা যাচাই করুন।
প্রতিটি ফিচারের জন্য অতিরিক্ত মেমরির প্রয়োজন হয়। বিভিন্ন সিনারিও ডিবাগ করার সময়, বিবেচনা করুন যে এটি প্রত্যাশিত ব্যবহার কিনা, নাকি এটি আসলেই একটি মেমরি লিক। উদাহরণস্বরূপ, বিভিন্ন ফিচার বা ইউজার টাস্কের জন্য নিম্নলিখিত সম্ভাবনাগুলো বিবেচনা করুন:
সম্ভবত মেমরি লিক: একাধিকবার সিনারিওটি সক্রিয় করার ফলে সময়ের সাথে সাথে মেমরির ব্যবহার বৃদ্ধি পায়।
সম্ভাব্য মেমরি ব্যবহার : সিনারিও বন্ধ করার পর মেমরি পুনরুদ্ধার করা হয়।
সম্ভাব্য প্রত্যাশিত মেমরি ব্যবহার : মেমরি ব্যবহার কিছু সময়ের জন্য বৃদ্ধি পায় এবং তারপর ধীরে ধীরে কমে আসে। এটি একটি সীমাবদ্ধ ক্যাশে বা অন্য কোনো প্রত্যাশিত মেমরি ব্যবহারের কারণে হতে পারে।
অ্যাপের আচরণ যদি প্রত্যাশিত মেমরি ব্যবহারের অনুরূপ হয়, তবে আপনার অ্যাপের মেমরি ব্যবস্থাপনার মাধ্যমে সমস্যাটির সমাধান করা যেতে পারে। সাহায্যের জন্য, ‘আপনার অ্যাপের মেমরি ব্যবস্থাপনা’ দেখুন।
ধাপ ৩: উচ্চ স্তরে ডিবাগ করুন
যখন আপনি কোনো মেমরি লিক ডিবাগ করবেন, তখন উচ্চ স্তর থেকে শুরু করুন এবং সম্ভাবনাগুলো সীমিত করে আনার পর আরও গভীরে যান। সময়ের সাথে সাথে কোনো লিক হচ্ছে কিনা, তা প্রথমে বিশ্লেষণ করতে এই উচ্চ-স্তরের ডিবাগিং টুলগুলোর মধ্যে একটি ব্যবহার করুন:
অ্যান্ড্রয়েড স্টুডিও মেমরি প্রোফাইলার (প্রস্তাবিত)
অ্যান্ড্রয়েড স্টুডিও মেমরি প্রোফাইলার
এই টুলটি আপনাকে ব্যবহৃত মেমরির একটি ভিজ্যুয়াল হিস্টোগ্রাম দেখায়। এই একই ইন্টারফেস থেকে হিপ ডাম্প এবং অ্যালোকেশন ট্র্যাকিংও চালু করা যায়। এই টুলটিই ডিফল্ট সুপারিশ। আরও তথ্যের জন্য, অ্যান্ড্রয়েড স্টুডিও মেমরি প্রোফাইলার দেখুন।
পারফেটটো মেমরি কাউন্টার
পারফেটটো আপনাকে একাধিক মেট্রিক ট্র্যাক করার উপর সুনির্দিষ্ট নিয়ন্ত্রণ দেয় এবং এই সবকিছু একটিমাত্র হিস্টোগ্রামে উপস্থাপন করে। আরও তথ্যের জন্য, পারফেটটো মেমরি কাউন্টারস দেখুন।

অ্যান্ড্রয়েড ডিবাগ ব্রিজ (adb) কমান্ড লাইন ইউটিলিটি
পারফেটোর মাধ্যমে আপনি যা কিছু ট্র্যাক করতে পারেন, তার বেশিরভাগই একটি adb কমান্ড লাইন ইউটিলিটি হিসেবেও পাওয়া যায়, যা আপনি সরাসরি কোয়েরি করতে পারেন। কয়েকটি গুরুত্বপূর্ণ উদাহরণ হলো:
মেমইনফো আপনাকে যেকোনো নির্দিষ্ট সময়ে মেমোরির বিস্তারিত তথ্য দেখতে দেয়।
Procstats সময়ের সাথে সাথে কিছু গুরুত্বপূর্ণ সামগ্রিক পরিসংখ্যান প্রদান করে।
এখানে দেখার মতো একটি গুরুত্বপূর্ণ পরিসংখ্যান হলো সময়ের সাথে সাথে অ্যাপটির জন্য প্রয়োজনীয় সর্বোচ্চ ফিজিক্যাল মেমোরি ফুটপ্রিন্ট (maxRSS)। MaxPSS ততটা নির্ভুল নাও হতে পারে। নির্ভুলতা বাড়ানোর একটি উপায় জানতে, adb shell dumpsys procstats --help –start-testing ফ্ল্যাগটি দেখুন।
বরাদ্দ ট্র্যাকিং
অ্যালোকেশন ট্র্যাকিং স্ট্যাক ট্রেসের মাধ্যমে শনাক্ত করে যে কোথায় মেমরি বরাদ্দ করা হয়েছিল এবং তা মুক্ত করা হয়নি কিনা। নেটিভ কোডে মেমরি লিক খুঁজে বের করার ক্ষেত্রে এই ধাপটি বিশেষভাবে কার্যকর। যেহেতু এই টুলটি স্ট্যাক ট্রেস শনাক্ত করে, তাই এটি মূল কারণ দ্রুত ডিবাগ করতে বা সমস্যাটি পুনরায় তৈরি করার উপায় বের করতে একটি দুর্দান্ত মাধ্যম হতে পারে। অ্যালোকেশন ট্র্যাকিং ব্যবহারের ধাপগুলোর জন্য, "অ্যালোকেশন ট্র্যাকিং ব্যবহার করে নেটিভ কোডে মেমরি ডিবাগ করুন" দেখুন।
ধাপ ৪: হিপ ডাম্পের মাধ্যমে আপনার অ্যাপের মেমরি ব্যবহার পরীক্ষা করুন।
মেমরি লিক শনাক্ত করার একটি উপায় হলো আপনার অ্যাপের একটি হিপ ডাম্প সংগ্রহ করা এবং তারপর লিকের জন্য তা পরীক্ষা করা। হিপ ডাম্প হলো একটি অ্যাপের মেমরিতে থাকা সমস্ত অবজেক্টের একটি স্ন্যাপশট। এটি মেমরি লিক এবং অন্যান্য মেমরি-সম্পর্কিত সমস্যা নির্ণয় করতে ব্যবহার করা যেতে পারে।
অ্যান্ড্রয়েড স্টুডিও এমন মেমোরি লিক শনাক্ত করতে পারে যা গার্বেজ কালেক্টর (GC) দ্বারা সমাধানযোগ্য নয়। আপনি যখন একটি হিপ ডাম্প ক্যাপচার করেন, অ্যান্ড্রয়েড স্টুডিও পরীক্ষা করে দেখে যে এমন কোনো অ্যাক্টিভিটি বা ফ্র্যাগমেন্ট আছে কি না যা তখনও অ্যাক্সেসযোগ্য কিন্তু ইতিমধ্যে ধ্বংস হয়ে গেছে।
বিস্তারিত জানতে নিম্নলিখিত বিভাগগুলি দেখুন।
হিপ ডাম্প ক্যাপচার করুন
হিপ ডাম্প ক্যাপচার করার জন্য, আপনি অ্যান্ড্রয়েড ডিবাগ ব্রিজ (adb) অথবা অ্যান্ড্রয়েড স্টুডিও মেমোরি প্রোফাইলার ব্যবহার করতে পারেন।
হিপ ডাম্প ক্যাপচার করতে adb ব্যবহার করুন
adb ব্যবহার করে হিপ ডাম্প ক্যাপচার করতে, এই ধাপগুলো অনুসরণ করুন:
- আপনার অ্যান্ড্রয়েড ডিভাইসটি আপনার কম্পিউটারের সাথে সংযুক্ত করুন।
- কমান্ড প্রম্পট খুলুন এবং সেই ডিরেক্টরিতে যান যেখানে adb টুলগুলো রয়েছে।
হিপ ডাম্প ক্যাপচার করতে এই কমান্ডটি চালান:
adb shell am dumpheap my.app.name $PHONE_FILE_OUTহিপ ডাম্প পুনরুদ্ধার করতে, এই কমান্ডটি চালান:
adb pull $PHONE_FILE_OUT $LOCAL_FILE.
অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে একটি হিপ ডাম্প ক্যাপচার করুন।
অ্যান্ড্রয়েড স্টুডিও মেমোরি প্রোফাইলার ব্যবহার করে হিপ ডাম্প ক্যাপচার করতে, অ্যান্ড্রয়েড ক্যাপচার এ হিপডাম্প সেকশনের এই ধাপগুলো অনুসরণ করুন।
মেমরি লিক খুঁজে বের করতে হিপ ডাম্প বিশ্লেষণ করুন।
একবার হিপ ডাম্প ক্যাপচার করার পর, আপনি অ্যান্ড্রয়েড স্টুডিও মেমোরি প্রোফাইলার ব্যবহার করে তা বিশ্লেষণ করতে পারেন। এটি করার জন্য, এই ধাপগুলো অনুসরণ করুন:
অ্যান্ড্রয়েড স্টুডিওতে আপনার অ্যান্ড্রয়েড প্রজেক্টটি খুলুন।
রান নির্বাচন করুন, এবং তারপর ডিবাগ কনফিগারেশন নির্বাচন করুন।
অ্যান্ড্রয়েড প্রোফাইলার ট্যাবটি খুলুন।
মেমরি নির্বাচন করুন।
‘ওপেন হিপ ডাম্প’ নির্বাচন করুন এবং আপনার তৈরি করা হিপ ডাম্প ফাইলটি বেছে নিন। মেমরি প্রোফাইলার আপনার অ্যাপের মেমরি ব্যবহারের একটি গ্রাফ প্রদর্শন করবে।
হিপ ডাম্প বিশ্লেষণ করতে গ্রাফটি ব্যবহার করুন:
যে বস্তুগুলো আর ব্যবহার করা হচ্ছে না, সেগুলো চিহ্নিত করুন।
যেসব অবজেক্ট বেশি মেমরি ব্যবহার করে, সেগুলো শনাক্ত করুন।
প্রতিটি অবজেক্ট কী পরিমাণ মেমরি ব্যবহার করছে তা দেখুন।
এই তথ্য ব্যবহার করে মেমরি লিকের উৎস চিহ্নিত করুন বা খুঁজে বের করে তা সমাধান করুন।
ধাপ ৫: মেমরি লিক ঠিক করুন
একবার মেমোরি লিকের উৎস শনাক্ত করতে পারলে, আপনি তা ঠিক করতে পারেন। আপনার অ্যান্ড্রয়েড অ্যাপে মেমোরি লিক ঠিক করলে অ্যাপের পারফরম্যান্স এবং স্থিতিশীলতা উন্নত হয়। পরিস্থিতিভেদে এর বিস্তারিত বিবরণ ভিন্ন হতে পারে। তবে, নিম্নলিখিত পরামর্শগুলো সহায়ক হতে পারে:
আপনার অ্যাপটি যেন অ্যান্ড্রয়েডের 'Manage your app's memory' টপিকের সুপারিশ অনুযায়ী মেমরি বরাদ্দ ও মুক্ত করে, তা নিশ্চিত করুন।
আপনার অ্যাপ থেকে অব্যবহৃত কোড বা রিসোর্স সরিয়ে ফেলুন। অ্যান্ড্রয়েড অ্যাপের বিস্তারিত তথ্যের জন্য, অ্যান্ড্রয়েড অ্যাপের সেরা অনুশীলনসমূহ দেখুন।
অন্যান্য ডিবাগিং টুল
এই ধাপগুলো সম্পন্ন করার পরেও যদি আপনি মেমরি লিকটি খুঁজে না পান এবং সমাধান করতে না পারেন, তাহলে এই টুলগুলো ব্যবহার করে দেখুন:
- অ্যালোকেশন ট্র্যাকিং ব্যবহার করে নেটিভ কোডে মেমরি ডিবাগ করুন ।
- LeakCanary-এর সাহায্যে লিক শনাক্ত করুন ।
অ্যালোকেশন ট্র্যাকিং ব্যবহার করে নেটিভ কোডে মেমরি ডিবাগ করুন।
আপনি সরাসরি নেটিভ কোড ব্যবহার না করলেও, গুগল এসডিকে-সহ বেশ কিছু প্রচলিত অ্যান্ড্রয়েড লাইব্রেরি তা ব্যবহার করে থাকে। আপনার যদি মনে হয় মেমরি লিকটি নেটিভ কোডে হচ্ছে, তবে এটি ডিবাগ করার জন্য আপনি বেশ কিছু টুল ব্যবহার করতে পারেন। অ্যান্ড্রয়েড স্টুডিও অথবা হিপপ্রএফডি (যা পারফেট্টোর সাথেও সামঞ্জস্যপূর্ণ) দিয়ে অ্যালোকেশন ট্র্যাকিং করা মেমরি লিকের সম্ভাব্য কারণগুলো শনাক্ত করার একটি চমৎকার উপায় এবং এটি প্রায়শই ডিবাগ করার দ্রুততম পদ্ধতি।
অ্যালোকেশন ট্র্যাকিংয়ের আরেকটি স্বতন্ত্র সুবিধা হলো, এর মাধ্যমে আপনি হিপের মধ্যে থাকা সংবেদনশীল তথ্য অন্তর্ভুক্ত না করেই ফলাফল শেয়ার করতে পারেন।
LeakCanary-এর সাহায্যে লিক শনাক্ত করুন।
LeakCanary হলো অ্যান্ড্রয়েড অ্যাপে মেমোরি লিক শনাক্ত করার একটি শক্তিশালী টুল। আপনার অ্যাপে LeakCanary কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও জানতে, LeakCanary ওয়েবসাইটটি দেখুন।
গুগল এসডিকে-এর সমস্যাগুলো কীভাবে রিপোর্ট করবেন
আপনি যদি এই নথিতে বর্ণিত পদ্ধতিগুলো চেষ্টা করে থাকেন এবং আমাদের SDK-গুলোতে মেমরি লিকের সন্দেহ করেন, তাহলে নিম্নলিখিত তথ্যগুলো যথাসম্ভব বেশি করে গ্রাহক সহায়তায় যোগাযোগ করুন:
মেমোরি লিকটি পুনরায় তৈরি করার ধাপসমূহ । যদি এই ধাপগুলোর জন্য জটিল কোডিংয়ের প্রয়োজন হয়, তবে সমস্যাটি তৈরি করে এমন কোডটি আমাদের স্যাম্পল অ্যাপে কপি করে দিলে এবং লিকটি সক্রিয় করার জন্য UI-তে যে অতিরিক্ত পদক্ষেপগুলো নিতে হবে তা উল্লেখ করলে সুবিধা হতে পারে।
সমস্যাটি পুনরায় তৈরি করার পর আপনার অ্যাপ থেকে হিপ ডাম্প ক্যাপচার করুন । দুটি ভিন্ন সময়ে হিপ ডাম্প ক্যাপচার করুন, যাতে দেখা যায় যে মেমরি ব্যবহার উল্লেখযোগ্য পরিমাণে বৃদ্ধি পেয়েছে।
যদি নেটিভ মেমোরি লিকের আশঙ্কা থাকে , তাহলে heapprofd থেকে অ্যালোকেশন ট্র্যাকিং আউটপুটটি শেয়ার করুন।
লিকের অবস্থাটি পুনরায় তৈরি করার পর নেওয়া একটি বাগ রিপোর্ট ।
যেকোনো মেমরি-সম্পর্কিত ক্র্যাশের স্ট্যাক ট্রেস ।
গুরুত্বপূর্ণ দ্রষ্টব্য : মেমরি সংক্রান্ত সমস্যা ডিবাগ করার জন্য সাধারণত শুধু স্ট্যাক ট্রেস যথেষ্ট নয়, তাই নিশ্চিত করুন যে আপনি অন্য কোনো ধরনের তথ্যও প্রদান করছেন।