মেমরি / রিসোর্স লিকগুলি খুঁজে পেতে কোন অ্যান্ড্রয়েড সরঞ্জাম এবং পদ্ধতিগুলি সবচেয়ে ভাল কাজ করে? [বন্ধ]


152

আমি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন বিকাশ পেয়েছি এবং আমি একটি ফোন অ্যাপ্লিকেশন বিকাশের পর্যায়ে পৌঁছেছি যেখানে সমস্ত কিছু ভালভাবে কাজ করছে বলে মনে হচ্ছে এবং আপনি বিজয় এবং জাহাজ ঘোষণা করতে চান, তবে আপনি জানেন যে সেখানে কিছু স্মৃতি এবং রিসোর্স লিক থাকতে হবে you সেখানে; এবং অ্যান্ড্রয়েডে কেবলমাত্র 16 মিমের গাদা রয়েছে এবং এটি একটি অ্যান্ড্রয়েড অ্যাপে দৃশ্যত আশ্চর্যজনকভাবে ফাঁস হওয়া সহজ।

আমি প্রায় ঘুরে দেখছি এবং এখনও অবধি কেবল 'এইচআরএফ' এবং 'ট্রেসভিউ'-র তথ্য খনন করতে সক্ষম হয়েছি এবং অনেকগুলি অনুকূল পর্যালোচনাও পাওয়া যায় না।

কোন ওএস প্রকল্পে আপনি কী কী সরঞ্জাম বা পদ্ধতিগুলি দেখতে পেয়েছেন বা বিকাশ করেছেন এবং সম্ভবত ভাগ করে নেওয়ার যত্ন নিয়েছেন?


3
আমি কি ভোট দিতে পারি - তার নাম পরিবর্তন করে কিছু মানুষের পাঠযোগ্য to
জেপিএম

1
আমরা যদি প্রশ্ন-শিরোনাম থেকে "অ্যান্ড্রয়েড সরঞ্জাম" শব্দটি সরিয়ে ফেলি তবে এই প্রশ্নটি কি আবার খোলা উচিত? এখানে পাওয়া উত্তরগুলি আমার স্মৃতি ফাঁসের সমস্যাগুলি সমাধান করার জন্য বেশ দরকারী
বি

ঠিক আছে, সুতরাং আমার কাছে ক্রমাগত ক্রিয়াকলাপগুলির মধ্যে একজন ব্যবহারকারী স্যুইচ করে চলেছে, যার অর্থ তারা 20 সেকেন্ডে 15 টি ক্রিয়াকলাপ পরিবর্তন করেছে। এটি কি স্মৃতি ত্যাগের কোনও কারণ হতে পারে? এটি ঠিক করার জন্য আমার কী করা উচিত? ধন্যবাদ!
রুচির বড়োনিয়া

1
এটি প্রতিক্রিয়া হিসাবে সরবরাহ করতে পারে না কারণ প্রশ্নটি বন্ধ হয়ে গেছে, তবে আমি লিক ক্যানারিটি একবার দেখার পরামর্শ দিই । আপনার অ্যাপ্লিকেশনটি কেবল ব্যবহার করুন, ক্রিয়াকলাপ খুলুন এবং বন্ধ করুন এবং গ্রন্থাগারটি এটির কাজ করতে দিন। এমনকি ফাঁসটি কোথায় ঘটেছে সে সম্পর্কে এটি আপনাকে জানাবে। ফাঁস হওয়ার পরে তার কাজটি করার জন্য কেবল ফাঁস বিশ্লেষককে কিছুটা সময় দিন - লিকের উত্স খুঁজে পাওয়া পর্যন্ত এটি প্রায় 2 মিনিট বা তার বেশি সময় নেয়। এর পরে এটি আপনার কাছে খুব সুন্দরভাবে অ্যাপ্লিকেশনটি উপস্থাপন করবে। কোন অতিরিক্ত সরঞ্জাম প্রয়োজন!
উবুন্টুড্রয়েড

উত্তর:


90

অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলি বিকাশ করে এমন একটি সাধারণ ত্রুটিটি হ'ল "java.lang.OutOfMemoryError: বিটম্যাপ আকার ভিএম বাজেটের ছাড়িয়ে গেছে" ত্রুটি। ওরিয়েন্টেশন পরিবর্তনের পরে প্রচুর বিটম্যাপ ব্যবহার করে ক্রিয়াকলাপগুলিতে এই ত্রুটিটি আমি স্বতঃস্ফূর্তভাবে দেখতে পেয়েছি: ক্রিয়াকলাপটি ধ্বংস হয়ে গেছে, আবার তৈরি হয়েছে এবং বিএমটিএমএল বিটম্যাপের জন্য উপলভ্য ভিএম মেমরি গ্রহণকারী লেআউটগুলি "স্ফীত" হয়েছে।

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

প্রথমে আপনার এক্সএমএল লেআউটের প্যারেন্ট ভিউতে "আইডি" বৈশিষ্ট্যটি সেট করুন:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:id="@+id/RootView"
     >
     ...

তারপরে, আপনার ক্রিয়াকলাপের onDestroy () পদ্ধতিতে, আনবাইন্ডড্রেইবলগুলি () পদ্ধতিটি প্যারেন্ট ভিউতে একটি রিফায়েন্স পাস করে কল করুন এবং তারপরে একটি সিস্টেম.gc () করুন

@Override
protected void onDestroy() {
    super.onDestroy();

    unbindDrawables(findViewById(R.id.RootView));
    System.gc();
}


private void unbindDrawables(View view) {

    if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
    }

    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
        }

        ((ViewGroup) view).removeAllViews();
    }
}

এই আনবাইন্ডড্রেইবলগুলি () পদ্ধতিটি ভিউ ট্রিটিকে পুনরাবৃত্তভাবে অনুসন্ধান করে এবং:

  1. সমস্ত পটভূমি ড্রইবলগুলিতে কলব্যাকগুলি সরিয়ে দেয়
  2. প্রতিটি দর্শনগোষ্ঠীর বাচ্চাদের সরিয়ে দেয়

3
একটি সাধারণ সমস্যার ভাল সমাধান।

9
এটি অ্যাডাপ্টারভিউ (লিস্টভিউ, গ্রিডভিউ ইত্যাদি) এর সাবক্লাসের জন্য কাজ করে না।
অর্জুন

@ অর্জুন হ্যাঁ..এটি অ্যাডাপ্টারভিউ সাবক্লাসগুলির জন্য কাজ করে না। তার জন্য আপনাকে ব্যতিক্রম পরিচালনা করতে হবে। বিশ্রাম এটা ভাল কাজ করে। আমি আমার কোডটিতে এটি ব্যবহার করি এবং এটি দুর্দান্ত কাজ করে। আশাকরি এটা সাহায্য করবে.
এইচপি.অ্যান্ড্রয়েড

@ এইচপি.অ্যান্ড্রয়েড "ব্যতিক্রমটিকে এটি পরিচালনা করুন" এর মাধ্যমে কী দেখতে হবে তার উদাহরণ রয়েছে? আমি জিজ্ঞাসা করি কারণ আমার মধ্যে চিত্রের পৃষ্ঠাগুলি রয়েছে PageAdapterএবং আমি এই ত্রুটিটি নিয়ে কাজ করছি :(
জ্যাকসনক্র

4
@ জ্যাকসন কেবল শর্তটি পরিবর্তন করুন: যদি (ভিউগ্রুপ && দেখুন (উদাহরণস্বরূপ অ্যাডাপ্টারভিউ দেখুন) এটি অ্যাডাপ্টারের জন্য আপনি যে ব্যতিক্রম পাচ্ছেন তা থেকে
মুক্তি পাবে


28

প্রায়শই ভবিষ্যতের গুগল ভ্রমণকারীদের জন্য:

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


6
অ্যান্ড্রয়েড starting.০ (মধুচক্র)
শুরুযোগ্য অঙ্কনগুলি হিপগুলিতে

@ টিমো তাহলে দেশীয় স্তূপে ফাঁস সনাক্ত করতে আপনি কী ব্যবহার করবেন?
5:55

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

20

@ এইচপি.অ্যান্ড্রয়েডের উত্তরটি ভাল কাজ করে যদি আপনি কেবল বিটম্যাপ ব্যাকগ্রাউন্ড নিয়ে কাজ করছেন তবে আমার ক্ষেত্রে আমার কাছে একটি এর BaseAdapterজন্য একটি সেট সরবরাহ ImageViewকরা হয়েছিল GridViewunbindDrawables()পরামর্শ হিসাবে আমি পদ্ধতিটি পরিবর্তন করেছি যাতে শর্তটি হয়:

if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
  ...
}

তবে সমস্যাটি হ'ল পুনরাবৃত্ত পদ্ধতিটি কখনই শিশুদের প্রসেস করে না AdapterView। এটির সমাধানের জন্য, আমি পরিবর্তে নিম্নলিখিতগুলি করেছি:

if (view instanceof ViewGroup) {
  ViewGroup viewGroup = (ViewGroup) view;
  for (int i = 0; i < viewGroup.getChildCount(); i++)
    unbindDrawables(viewGroup.getChildAt(i));

  if (!(view instanceof AdapterView))
    viewGroup.removeAllViews();
}

যাতে AdapterViewএখনও বাচ্চাদের বাচ্চাদের প্রক্রিয়াজাত করা যায় - পদ্ধতিটি কেবলমাত্র সমস্ত শিশুকে অপসারণ করার চেষ্টা করে না (যা অসমর্থিত)।

এটি ImageViewবিটম্যাপ পরিচালনা করে যেহেতু তাদের পটভূমি নয় তবে সমস্যাটি পুরোপুরি ঠিক করে না । তাই আমি নিম্নলিখিতটি যুক্ত করেছি। এটি আদর্শ নয় তবে এটি কাজ করে:

if (view instanceof ImageView) {
  ImageView imageView = (ImageView) view;
  imageView.setImageBitmap(null);
}

সামগ্রিকভাবে unbindDrawables()পদ্ধতিটি তখন:

private void unbindDrawables(View view) {
  if (view.getBackground() != null)
    view.getBackground().setCallback(null);

  if (view instanceof ImageView) {
    ImageView imageView = (ImageView) view;
    imageView.setImageBitmap(null);
  } else if (view instanceof ViewGroup) {
    ViewGroup viewGroup = (ViewGroup) view;
    for (int i = 0; i < viewGroup.getChildCount(); i++)
    unbindDrawables(viewGroup.getChildAt(i));

    if (!(view instanceof AdapterView))
      viewGroup.removeAllViews();
  }
}

আমি আশা করছি যে এই জাতীয় সংস্থানগুলি মুক্ত করার জন্য আরও নীতিগত পন্থা রয়েছে।


12

অ্যান্ড্রয়েডে মেমরি পরিচালনার বিষয়ে গুগল আই / ও টক (২০১১) পাশাপাশি মেমরির প্রোফাইলিংয়ের জন্য সরঞ্জামগুলি + কৌশলগুলির বিশদ:
http://www.youtube.com/watch?v=_CruQY55HOk


4
বা সংশ্লিষ্ট ব্লগ পোস্ট: android-developers.blogspot.com/2011/03/…
গ্রেগ 7gkb

1
ঠিক আছে, সুতরাং আমার কাছে ক্রমাগত ক্রিয়াকলাপগুলির মধ্যে একজন ব্যবহারকারী স্যুইচ করে চলেছে, যার অর্থ তারা 20 সেকেন্ডে 15 টি ক্রিয়াকলাপ পরিবর্তন করেছে। এটি কি স্মৃতি ত্যাগের কোনও কারণ হতে পারে? এটি ঠিক করার জন্য আমার কী করা উচিত? ধন্যবাদ! '
রুচির বারোনিয়া

4

ভালগ্রাইন্ডটি অ্যান্ড্রয়েডে মোজিল করা হয়েছে (মজিলা প্রযোজিত)। অ্যান্ড্রয়েডে ভালগ্রাইন্ড দেখুন - বর্তমান স্থিতি এবং এআরএম এ অ্যান্ড্রয়েডের জন্য ভালগ্রাইন্ড চলমান সমর্থন (মন্তব্য 67)।


এর জন্য একটি কাস্টম রম তৈরি করা দরকার।
অক্ষত

1

ঠিক আছে, এগুলি সেই সরঞ্জামগুলি যা অ্যান্ড্রয়েড ব্যবহার করে এমন অনন্য ফর্ম্যাটগুলির সাথে আবদ্ধ হয় I আমি মনে করি আপনি যা অসন্তুষ্ট হতে পারেন তা হ'ল ব্যবহারের অন্তর্নিহিত টেস্টিং কোড কাঠামো ..

আপনি কি অ্যান্ড্রয়েড মক ফ্রেমওয়ার্ক ব্যবহার করে কোডের মক টেস্টিং অঞ্চলগুলি ব্যবহার করে দেখেছেন?


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