নেভিগেশন খিলান উপাদান একটি মিথ্যা ইতিবাচক মেমরি ফাঁস তৈরি করতে পারে?


14

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

আমি নেভিগেশন খিলান উপাদান ব্যবহার করে এবং এমভিভিএম প্যাটার্ন অনুসরণ করি। আমি প্রকল্পের বিকাশে পরবর্তী সময়ে লিক কানারি লাইব্রেরি যুক্ত করেছি এবং আমি যখন পর্দার মাঝে নেভিগেট করি তখন এটি রক্ষিত উদাহরণগুলি সম্পর্কে সতর্কতা দিতে শুরু করে।

আমি যখন পিছনের স্ট্যাকের টুকরো টুকরো যোগ করি তখন সমস্যা হয়। পিছনে স্ট্যাক প্রতিটি যুক্ত টুকরা রক্ষিত দৃষ্টান্তগুলির পাল্টা বৃদ্ধি পায়। এটি যখন 5 টি এর প্রান্তিক মান পৌঁছে যায় তখন লিকনারি গাদা ফেলে এবং রিপোর্ট সরবরাহ করে।

তবে যদি আমি ব্যাক বোতামে ক্লিক করি এবং পূর্ববর্তী স্ক্রিনগুলিতে ফিরে যাই তবে রক্ষিত দৃষ্টান্তগুলির পাল্টা হ্রাস পায় এবং শেষ পর্যন্ত যখন 1 ম স্ক্রিনে ফিরে আসে তখন সমস্ত রক্ষিত দৃষ্টান্তগুলি অদৃশ্য হয়ে যায়।

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

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

আমি সন্দেহ করি যে নেভিগেশন উপাদানটি কোনও খণ্ডের নজির রাখছে যখন এটি পিছনের স্ট্যাকের মধ্যে রয়েছে এবং LeakCanary এটিকে ফাঁস হিসাবে দেখছে।

উত্তর:


24

ব্যাক স্ট্যাকের টুকরোগুলি এভাবে কাজ করে (এবং নেভিগেশন কেবল বিদ্যমান ফ্রেগমেন্ট এপিআই ব্যবহার করে): খণ্ডটির দৃষ্টিভঙ্গিটি ধ্বংস হয়ে যায়, তবে খণ্ডটি নিজেই ধ্বংস হয় না - CREATEDআপনি ব্যাকটিকে বোতাম না মেরে ফ্র্যাগমেন্টে ফিরে না আসা পর্যন্ত এগুলি রাজ্যে রাখা হয়। (যার পরে onCreateView()আবার কল করা হবে এবং আপনি এখানে ফিরে যান RESUMED)।

অনুযায়ী টুকরা: অতীত, বর্তমান, এবং ভবিষ্যতে আলাপ , ভবিষ্যতে এক পরিবর্তন টুকরা আসছে বরং দুটি পৃথক lifecycles থাকার চেয়ে, ফিরে স্ট্যাক টুকরা ধ্বংস করার বিকল্প একটি অপ্ট করা হয়। এটি এখনও হিসাবে উপলব্ধ নেই।

আপনাকে ভিউগুলিতে আপনার রেফারেন্সগুলি মুছে ফেলতে হবে কারণ onDestroyViewএটি সাইন ইন যে ভিউটি খন্ডিত সিস্টেম দ্বারা আর ব্যবহার করা হচ্ছে না এবং এটি নিরাপদে আবর্জনা সংগ্রহ করা যেতে পারে যদি এটি ভিউতে আপনার ক্রমাগত রেফারেন্সের জন্য না হয়।


2
অ্যান্ড্রয়েড ভিউ বাঁধাই এই সমস্যার সমাধান করে? ভিউ বাইন্ডিং ভিউ (সম্ভবত বাঁধাই করা বস্তু নিজেই) এর রেফারেন্সটি ভিউ বাইন্ডিংয়ের সাথে স্বয়ংক্রিয়ভাবে 'নীল আউট' হয়েছে কিনা সে সম্পর্কে আমি কোনও দলিল খুঁজে পাচ্ছি না onDestroyView
টিম মালসিদ

3
@ টিমমালসিড - আপনার নিজের বাধ্যবাধকতা সম্পর্কিত রেফারেন্সটি বাতিল করতে হবে, স্বয়ংক্রিয়ভাবে কিছুই চলছে না।
ianhanniballake

1
@ ইমানুয়েল - আপনার নিজের বাধ্যবাধকতার প্রতি আপনার রেফারেন্সটি ফেলে দিতে হবে কারণ এটির মালিকানার দর্শনগুলির একটি শক্ত রেফারেন্স রয়েছে।
ianhanniballake

1
@ এমমানুয়েল - আপনি সর্বদা একটি বৈশিষ্ট্য অনুরোধ ফাইল করতে পারেন !
ianhanniballake

1
@ এমমানুয়েল - আমি মনে করি এটি অবশ্যই আচরণের পরিবর্তন হবে (যা এটি পতাকাটিতে পৃথক অপ্ট হিসাবে চিহ্নিত হতে পারে), তবে সঠিক লাইফাইসাইকেলওয়ানারের পক্ষে স্মৃতি সংক্রান্ত সমস্যাগুলির পুরো বিশদটি ঠিক করার পক্ষে এটি যথেষ্ট তথ্য হতে পারে।
ianhanniballake
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.