অ্যান্ড্রয়েডে আমি কীভাবে আমার অ্যাপ্লিকেশনটির মেমরির ব্যবহার আবিষ্কার করব?


799

প্রোগ্রামডমেটিকভাবে আমি কীভাবে আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে ব্যবহৃত মেমরিটি খুঁজে পেতে পারি?

আমি এটি করার একটি উপায় আছে আশা করি। এছাড়াও, আমি কীভাবে ফোনের ফ্রি মেমরি পেতে পারি?


2
বা যদি কেউ এই সমস্ত সম্পর্কে আরও জানতে চান তবে দয়া করে http://elinux.org/Android_Memory_Usage দেখুন

1
আপনার অ্যাপ্লিকেশনটির মেমরি বিকাশকারীকে
andঅ্যান্ড্রয়েড

উত্তর:


1007

নোট করুন যে লিনাক্সের মতো আধুনিক অপারেটিং সিস্টেমগুলিতে মেমরির ব্যবহার একটি অত্যন্ত জটিল এবং বোঝার ক্ষেত্র। প্রকৃতপক্ষে আপনার সম্ভাব্যতা যা কিছু সংখ্যাই পাবেন বাস্তবে সঠিকভাবে ব্যাখ্যা করার সম্ভাবনাটি খুব কম। (আমি যখনই অন্যান্য ইঞ্জিনিয়ারদের সাথে মেমরি ব্যবহারের সংখ্যাগুলি দেখি তখন খুব সুন্দর হয়, তারা আসলে কী বোঝায় সে সম্পর্কে একটি দীর্ঘ আলোচনা হয় যা কেবলমাত্র একটি অস্পষ্ট সিদ্ধান্তে আসে))

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

প্রথম জিনিসটি সম্ভবত এই নিবন্ধটির শেষ অংশটি পড়তে হবে যাতে অ্যান্ড্রয়েডে মেমরি কীভাবে পরিচালিত হয় সে সম্পর্কে কিছুটা আলোচনা রয়েছে:

অ্যান্ড্রয়েড ২.০ দিয়ে শুরু হওয়া পরিষেবা API পরিবর্তন API

ActivityManager.getMemoryInfo()সামগ্রিক মেমরির ব্যবহার দেখার জন্য এখন আমাদের সর্বোচ্চ-স্তরের এপিআই। এটি বেশিরভাগই অ্যাপ্লিকেশন गेজটিকে সহায়তা করতে সহায়তা করে যা ব্যাকগ্রাউন্ড প্রক্রিয়াগুলির জন্য সিস্টেমটি আরও মেমরি না পেয়ে চলেছে, সুতরাং পরিষেবাগুলির মতো প্রয়োজনীয় প্রক্রিয়াগুলি হত্যা শুরু করতে হবে। খাঁটি জাভা অ্যাপ্লিকেশনগুলির জন্য এটি খুব কম ব্যবহার করা উচিত, যেহেতু একটি অ্যাপ্লিকেশনটিকে এই মুহুর্তে সিস্টেমে চাপ দেওয়া থেকে বিরত রাখতে জাভা হ্যাপের সীমাটি কিছুটা অংশ রয়েছে।

নিম্ন-স্তরে গিয়ে আপনি মেমরির ব্যবহার সম্পর্কে কাঁচা কার্নেল-স্তরের তথ্য পেতে ডিবাগ এপিআই ব্যবহার করতে পারেন: android.os.Debug.MemoryInfo

2.0 দিয়ে শুরু করুন নোটটি ActivityManager.getProcessMemoryInfoঅন্য একটি প্রক্রিয়া সম্পর্কে এই তথ্যটি পেতে, একটি এপিআইও রয়েছে : ActivityManager.getProcessMemoryInfo (int [])

এটি এই সমস্ত ডেটা সহ একটি নিম্ন-স্তরের মেমরিআইনফো কাঠামোটি প্রদান করে:

    /** The proportional set size for dalvik. */
    public int dalvikPss;
    /** The private dirty pages used by dalvik. */
    public int dalvikPrivateDirty;
    /** The shared dirty pages used by dalvik. */
    public int dalvikSharedDirty;

    /** The proportional set size for the native heap. */
    public int nativePss;
    /** The private dirty pages used by the native heap. */
    public int nativePrivateDirty;
    /** The shared dirty pages used by the native heap. */
    public int nativeSharedDirty;

    /** The proportional set size for everything else. */
    public int otherPss;
    /** The private dirty pages used by everything else. */
    public int otherPrivateDirty;
    /** The shared dirty pages used by everything else. */
    public int otherSharedDirty;

কিন্তু কি পার্থক্য মধ্যে হিসেবে Pss, PrivateDirtyএবং SharedDirty... এখন মজা শুরু হয়।

অ্যান্ড্রয়েডে প্রচুর মেমরি (এবং সাধারণভাবে লিনাক্স সিস্টেমগুলি) আসলে একাধিক প্রক্রিয়া জুড়ে ভাগ করা হয়। সুতরাং একটি প্রক্রিয়া কত স্মৃতি ব্যবহার করে তা সত্যিই পরিষ্কার নয়। এই পেজিংয়ের উপরে ডিস্কে জুড়ুন (আমরা অ্যান্ড্রয়েডে ব্যবহার করি না এমন সোয়্যাপটি ছেড়ে দিন) এবং এটি আরও কম পরিষ্কার।

সুতরাং আপনি যদি প্রতিটি প্রক্রিয়াটিতে প্রকৃত ম্যাপযুক্ত সমস্ত শারীরিক র্যাম নিয়ে যান এবং সমস্ত প্রক্রিয়া যুক্ত করেন তবে আপনি সম্ভবত আসল মোট র‌্যামের চেয়ে অনেক বেশি সংখ্যক সমাপ্ত হতে পারেন।

Pssএকটি প্রক্রিয়া প্রক্রিয়া সংখ্যাও যে পেজটি ব্যবহারের একটি অনুপাত দ্বারা স্কেল করা হয় উপস্থিত RAM- র মূলত প্রতিটি পৃষ্ঠার - একটি মেট্রিক কার্নেল নির্ণয় সেই অ্যাকাউন্টে মেমরির শেয়ারিং মধ্যে নেয়। এইভাবে আপনি (তত্ত্বের ভিত্তিতে) তারা ব্যবহার করছেন মোট র্যাম দেখতে সমস্ত প্রক্রিয়া জুড়ে পিএসএস যোগ করতে এবং তাদের আপেক্ষিক ওজনের সম্পর্কে মোটামুটি ধারণা পেতে প্রসেসের মধ্যে পিএসএস তুলনা করতে পারেন।

এখানে অন্য আকর্ষণীয় মেট্রিকটি PrivateDirtyহ'ল মূলত যে প্রক্রিয়াটির ভিতরে র‌্যামের পরিমাণ এটি ডিস্কে পৃষ্ঠাবদ্ধ করা যায় না (এটি ডিস্কে একই ডেটা দ্বারা সমর্থন করা যায় না), এবং অন্য কোনও প্রক্রিয়ার সাথে ভাগ করা হয় না। এটি দেখার আরেকটি উপায় হ'ল র‍্যাম যা সেই প্রক্রিয়াটি চলে যাওয়ার পরে সিস্টেমে উপলব্ধ হয়ে উঠবে (এবং সম্ভবত তাড়াতাড়ি ক্যাশে এবং এর অন্যান্য ব্যবহারগুলিতে ডুবে গেছে)।

এটি এর জন্য এসডিকে এপিআইগুলি বেশ সুন্দর। তবে আপনার ডিভাইস সহ আপনি বিকাশকারী হিসাবে আরও কিছু করতে পারেন।

ব্যবহার করে adb, একটি চলমান সিস্টেমের মেমরির ব্যবহার সম্পর্কে আপনি প্রচুর তথ্য পেতে পারেন। একটি সাধারণ হ'ল কমান্ড adb shell dumpsys meminfoযা প্রতিটি জাভা প্রক্রিয়াটির মেমরি ব্যবহার সম্পর্কে একগুচ্ছ তথ্য ছড়িয়ে দেবে, উপরের তথ্যটি এবং অন্যান্য বিভিন্ন জিনিস রাখবে containing আপনি দেখতে একক প্রক্রিয়ার নাম বা পিডের বিষয়টিও দেখতে পারেন, উদাহরণস্বরূপ adb shell dumpsys meminfo systemআমাকে সিস্টেম প্রক্রিয়াটি দিন:

** পিড 890 [সিস্টেম] এর মধ্যে স্মরণিকা **
                    নেটিভ ডালভিক অন্যান্য মোট
            আকার: 10940 7047 এন / এ 17987
       বরাদ্দ: 8943 5516 এন / এ 14459
            বিনামূল্যে: 336 1531 এন / এ 1867
           (পিএসএস): 4585 9282 11916 25783
  (ভাগ করা নোংরা): 2184 3596 916 6696
    (বেসরকারী নোংরা): 4504 5956 7456 17916

 অবজেক্টস
           বার দেখা হয়েছে: 149 ভিউ রুটস: 4
     অ্যাপকন্টেক্সটস: 13 ক্রিয়াকলাপ: 0
          সম্পদ: 4 সম্পদ ব্যবস্থাপনার: 4
   স্থানীয় বাইন্ডার: 141 প্রক্সি বাইন্ডার: 158
মৃত্যু প্রাপক: 49
 ওপেনএসএসএল সকেট: 0

 এসকিউএল
            গাদা: 205 ডিবিফিল: 0
       numPagers: 0 নিষ্ক্রিয় পেজ কেবি: 0
    activePageKB: 0

শীর্ষ অধ্যায় প্রধান এক, কোথায় sizeএকটি নির্দিষ্ট গাদা এর অ্যাড্রেস স্পেস মোট আকার allocated, প্রকৃত বরাদ্দ KB গাদা মনে করেন যে এটা আছে freeঅবশিষ্ট KB গাদা অতিরিক্ত বরাদ্দ জন্য রয়েছে বিনামূল্যে, এবং pssএবং priv dirtyএকই প্রতিটি স্তূপের সাথে সম্পর্কিত পৃষ্ঠাগুলির সাথে নির্দিষ্ট হিসাবে আগে আলোচনা করা হয়েছে।

আপনি যদি কেবল সমস্ত প্রক্রিয়া জুড়ে মেমরির ব্যবহারটি দেখতে চান তবে আপনি কমান্ডটি ব্যবহার করতে পারেন adb shell procrank। একই সিস্টেমে এটির আউটপুট দেখে মনে হচ্ছে:

  পিআইডি ভিএসএস আরএসএস পিএস ইউএস সেমিডলাইন
  890 84456 কে 48668 কে 25850 কে 21284 কে সিস্টেম_সেসভার
 1231 50748K 39088K 17587K 13792K com.android.launcher2
  947 34488K 28528K 10834K 9308K com.android.wallpaper
  987 26964K 26956K 8751K 7308K com.google.process.gapps
  954 24300 কে 24296 কে 6249 কে 4824 কে কম.এন্ড্রয়েড.ফোন
  948 23020K 23016K 5864K 4748K com.android.inputmethod.latin
  888 25728 কে 25724 কে 5774K 3668K জাইগোট
  977 24100K 24096K 5667K 4340K android.process.acore
...
   59 336 কে 332 কে 99 কে 92 কে / সিস্টেম / বিন / ইনস্টলড
   60 396K 392K 93K 84K / সিস্টেম / বিন / কীস্টোর
   51 280 কে 276 কে 74 কে 68 কে / সিস্টেম / বিন / সার্ভিস ম্যানেজার
   54 256 কে 252 কে 69 কে 64 কে / সিস্টেম / বিন / ডিবাগার্ড

এখানে Vssএবং Rssকলামগুলি মূলত শব্দ করছে (এগুলি হ'ল কোনও প্রসেসের সোজা-সামনের ঠিকানা স্পেস এবং র্যাম ব্যবহার, যেখানে আপনি যদি প্রসেস জুড়ে র‌্যামের ব্যবহার যোগ করেন তবে আপনি একটি হাস্যকর আকারে বড় সংখ্যা পাবেন)।

Pssআমরা যেমন আগে দেখেছি, Ussতেমন রয়েছে Priv Dirty

মজার বিষয় এখানে উল্লেখ্য: Pssএবং Ussসামান্য (বা আরো একটু বেশি) কি আমরা দেখেছি চেয়ে ভিন্ন meminfo। কেন এমন? ভাল প্রক্যাঙ্ক তার ডেটা সংগ্রহ করার জন্য আলাদা কার্নেল প্রক্রিয়া ব্যবহার meminfoকরে এবং তারা কিছুটা আলাদা ফলাফল দেয়। কেন এমন? সত্যি বলতে আমার কোনও ক্লু নেই। আমি বিশ্বাস করি procrankএটি আরও নিখুঁত হতে পারে ... তবে সত্যই, এই বিষয়টিটি কেবল রেখে যায়: "লবণের দানা দিয়ে আপনি যে কোনও স্মৃতি তথ্য পাবেন; প্রায়শই খুব বড় শস্য হয়।"

অবশেষে কমান্ডটি রয়েছে adb shell cat /proc/meminfoযা সিস্টেমের সামগ্রিক মেমরি ব্যবহারের একটি সংক্ষিপ্তসার দেয়। এখানে প্রচুর ডেটা রয়েছে, কেবল প্রথম কয়েকটি সংখ্যক আলোচনার জন্য মূল্যবান (এবং বাকিগুলি কয়েকটি লোক দ্বারা বোঝা যায়, এবং তাদের সম্পর্কে এই কয়েকটি লোকের আমার প্রশ্নগুলি প্রায়শই বিবাদমূলক ব্যাখ্যা দেয়):

মেমোটোটাল: 395144 কেবি
মেমফ্রি: 184936 কেবি
বাফারস: 880 কেবি
ক্যাশেড: 84104 কেবি
অদলবদল: 0 কেবি

MemTotal কার্নেল এবং ব্যবহারকারীর স্পেসের জন্য উপলব্ধ মোট পরিমাণ মেমরি (এটি প্রায়শই ডিভাইসের প্রকৃত শারীরিক র‍্যামের চেয়ে কম, যেহেতু সেই র‌্যামের কিছুটা রেডিও, ডিএমএ বাফার ইত্যাদির জন্য প্রয়োজন)।

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

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


1
কটাক্ষপাত আছে pixelbeat.org/scripts/ps_mem.py যা কৌশল উপরে উল্লিখিত ব্যবহার প্রোগ্রামের জন্য ব্যবহৃত র্যাম দেখানোর জন্য
pixelbeat

17
খুব সুন্দর লেখা! আমি এখানে ম্যাকজিভারদেভ.ব্লগস্পট.কম / ২০১১ / ১১ / ২ কে আপনার হিপ ব্যবহার পরীক্ষা করার জন্য মেমরি পরিচালনা এবং বিভিন্ন সরঞ্জামের ব্যবহার সম্পর্কে একটি পোস্ট লিখেছি যাতে যদি কেউ এটির কাজে লাগে finds
জোহান নরন

3
"ডালভিক" একটি "নেটিভ" দুটি কলাম ঠিক কী?
ডাকোজি

1
"দেশি" "ডালভিক" "অন্যান্য" ঠিক কী? আমার অ্যাপে "অন্যান্য" খুব বিশাল? আমি কীভাবে এটি হ্রাস করতে পারি?
Landry

আমি ব্যবহার করতে পারেন "adb shell dumpsys meminfo", কিন্তু "এডিবি শেল procrank" আমাকে বল।। "/ সিস্টেম / বিন / SH: procrank: পাওয়া যায়নি" আমি একটি clue.Wish না তুমি আমাকে সাহায্য করতে
হুগো

79

হ্যাঁ, আপনি প্রোগ্রামিয়ালি মেমরির তথ্য পেতে পারেন এবং মেমরি নিবিড় কাজ করবেন কিনা তা স্থির করতে পারেন।

ফোন করে ভিএম হিপ আকার পান:

Runtime.getRuntime().totalMemory();

কল করে বরাদ্দিত ভিএম মেমরি পান:

Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

কল করে ভিএম হিপ সাইজের সীমাবদ্ধতা পান:

Runtime.getRuntime().maxMemory()

কল করে নেটিভ বরাদ্দ মেমরি পান:

Debug.getNativeHeapAllocatedSize();

আমি আউটআউফ-মেমরিরির আচরণ এবং মেমরির ব্যবহার নিরীক্ষণ করতে একটি অ্যাপ তৈরি করেছি।

https://play.google.com/store/apps/details?id=net.coocood.oomresearch

আপনি https://github.com/coocood/oom-research এ উত্স কোডটি পেতে পারেন


7
এই রানটাইমটি কি বর্তমান প্রক্রিয়া বা সামগ্রিক সিস্টেমের হিপ দ্বারা মেমরির ব্যবহার ফিরিয়ে দেবে?
মাহেন্দ্রন

1
@ সর্বমোট () পদ্ধতির জাভাডোক থেকে @ মাহামাদি "চলমান প্রোগ্রামের জন্য উপলব্ধ মোট মেমরির পরিমাণটি ফিরিয়ে দেয়"
অ্যালেক্স

এটি প্রশ্নের সঠিক উত্তর নয়। উত্তরটি নির্দিষ্ট অ্যাপ্লিকেশন সম্পর্কে নয়।
আমির রেজাজাদেহ

52

এটি একটি কাজ চলছে, তবে এটি আমি বুঝতে পারি না:

ActivityManager activityManager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);

Log.i(TAG, " memoryInfo.availMem " + memoryInfo.availMem + "\n" );
Log.i(TAG, " memoryInfo.lowMemory " + memoryInfo.lowMemory + "\n" );
Log.i(TAG, " memoryInfo.threshold " + memoryInfo.threshold + "\n" );

List<RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();

Map<Integer, String> pidMap = new TreeMap<Integer, String>();
for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses)
{
    pidMap.put(runningAppProcessInfo.pid, runningAppProcessInfo.processName);
}

Collection<Integer> keys = pidMap.keySet();

for(int key : keys)
{
    int pids[] = new int[1];
    pids[0] = key;
    android.os.Debug.MemoryInfo[] memoryInfoArray = activityManager.getProcessMemoryInfo(pids);
    for(android.os.Debug.MemoryInfo pidMemoryInfo: memoryInfoArray)
    {
        Log.i(TAG, String.format("** MEMINFO in pid %d [%s] **\n",pids[0],pidMap.get(pids[0])));
        Log.i(TAG, " pidMemoryInfo.getTotalPrivateDirty(): " + pidMemoryInfo.getTotalPrivateDirty() + "\n");
        Log.i(TAG, " pidMemoryInfo.getTotalPss(): " + pidMemoryInfo.getTotalPss() + "\n");
        Log.i(TAG, " pidMemoryInfo.getTotalSharedDirty(): " + pidMemoryInfo.getTotalSharedDirty() + "\n");
    }
}

পিআইডি কেন ক্রিয়াকলাপে ম্যানেজআরটজেটপ্রসেসমেমরিআইফোন () এর ফলাফলটিতে ম্যাপ করা হচ্ছে না? স্পষ্টতই আপনি ফলাফলের ডেটা অর্থবহ করতে চাইছেন, তবে গুগল কেন ফলাফলগুলি সংযুক্তি করতে এত কঠিন করেছে? বর্তমান সিস্টেমটি এমনকি কার্যকরভাবে কাজ করে না যদি আমি সম্পূর্ণ মেমরির ব্যবহার প্রক্রিয়া করতে চাই যেহেতু প্রত্যাবর্তিত ফলাফলটি android.os.Debug.MemoryInfo অবজেক্টগুলির একটি অ্যারে, তবে objects অবজেক্টগুলির মধ্যে কোনটিই আসলে তারা আপনাকে জানায় না যে তারা কোন পিডের সাথে যুক্ত। আপনি যদি সমস্ত পিডের একটি অ্যারে সহজেই পাস করেন তবে ফলাফলগুলি বোঝার আপনার কোনও উপায় থাকবে না। যেহেতু আমি এটির ব্যবহারটি বুঝতে পেরেছি, এটি একবারে একাধিক পিডের মধ্যে দিয়ে যাওয়া অর্থহীন করে তোলে এবং তারপরে যদি এটি হয় তবে এটি কেন এমনভাবে তৈরি করুন যাতে ক্রিয়াকলাপম্যানেজ.জেটপ্রসেস মেমরিআইএনফো () কেবলমাত্র একটি ইন্টার অ্যারে নেয়?


2
তারা সম্ভবত ইনপুট অ্যারের মতো একই ক্রমে রয়েছে।
taer

2
এটি জিনিসগুলি করার জন্য খুব অ-স্বজ্ঞাত উপায় বলে মনে হচ্ছে। হ্যাঁ, সম্ভবত এটিই কেস, তবে এটি কোনওভাবে কীভাবে ওওপি?
রায়ান Beesley

6
এপিআই দক্ষতার জন্য ডিজাইন করা হয়েছিল, ব্যবহারের সহজতা বা সরলতার জন্য নয়। এটি কেবল এমন নয় যা 99% অ্যাপ্লিকেশনগুলির স্পর্শ করা উচিত, তাই দক্ষতা সর্বাধিক গুরুত্বপূর্ণ ডিজাইনের লক্ষ্য।
হ্যাকবড

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

5
এটি একটি গৌণ সমস্যা, তবে লগের জন্য, আপনার জন্য পরিচালিত একটি লাইনফিড যুক্ত করা প্রয়োজন হয় না।
থমাসডাব্লু

24

হ্যাকবডস স্ট্যাক ওভারফ্লোতে সেরা উত্তরগুলির মধ্যে একটি। এটি একটি খুব অস্পষ্ট বিষয়ে আলোক ছুঁড়ে দেয়। এটা আমাকে অনেক সাহায্য করেছে।

আর একটি সত্যই সহায়ক সহায়ক এটি হ'ল ভিডিওটি দেখতে হবে: গুগল আই / ও ২০১১: অ্যান্ড্রয়েড অ্যাপসের জন্য মেমরি পরিচালনা


হালনাগাদ:

প্রক্রিয়া পরিসংখ্যান, আপনার অ্যাপ্লিকেশনটি কীভাবে ব্লগ পোস্টে মেমরি পরিচালনা করে তা আবিষ্কার করার একটি পরিষেবা প্রক্রিয়া পরিসংখ্যান: আপনার অ্যাপ কীভাবে ডায়ান হ্যাকোবার দ্বারা র‌্যাম ব্যবহার করে তা বোঝা:


19

অ্যান্ড্রয়েড স্টুডিও 0.8.10+ মেমরি মনিটর নামে একটি অবিশ্বাস্যভাবে কার্যকর সরঞ্জাম চালু করেছে ।

এখানে চিত্র বর্ণনা লিখুন

এটি কি জন্য ভাল:

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

এখানে চিত্র বর্ণনা লিখুন

চিত্র 1. অ্যান্ড্রয়েড মেমরি মনিটরে একটি জিসি (আবর্জনা সংগ্রহ) ইভেন্ট জোর করে

এটি ব্যবহার করে আপনার অ্যাপের র‍্যামের রিয়েল-টাইম খরচ সম্পর্কে আপনার প্রচুর ভাল তথ্য থাকতে পারে।


16

1) আমি অনুমান করি না, অন্তত জাভা থেকে নয়।
2)

ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
MemoryInfo mi = new MemoryInfo();
activityManager.getMemoryInfo(mi);
Log.i("memory free", "" + mi.availMem);

1
(অ্যাক্টিভিটি ম্যানেজার অ্যাক্টিভিটি ম্যানেজার = (অ্যাক্টিভিটি ম্যানেজার) getSystemService (ACTIVITY_SERVICE);) এর পরিবর্তে (ক্রিয়াকলাপ ম্যানেজার ক্রিয়াকলাপব্যবস্থাপনা = = (ক্রিয়াকলাপ ম্যানেজার) getSystemService (ACTIVITY_SERVICE);)
রাজকামাল

7

আমরা খুঁজে পেয়েছি যে বর্তমান প্রক্রিয়াটির মোট স্মৃতি পাওয়ার সমস্ত স্ট্যান্ডার্ড পদ্ধতিতে কিছু সমস্যা আছে।

  • Runtime.getRuntime().totalMemory(): কেবল জেভিএম মেমরিটি দেয়
  • ActivityManager.getMemoryInfo(), Process.getFreeMemory()এবং এর উপর ভিত্তি করে অন্য যে কোনও কিছুই /proc/meminfo- সংযুক্ত সমস্ত প্রক্রিয়া সম্পর্কে মেমরির তথ্য ফেরত দেয় (উদাহরণস্বরূপ android_util_Process.cpp )
  • Debug.getNativeHeapAllocatedSize()- mallinfo()যা malloc()কেবলমাত্র মেমরি বরাদ্দ এবং সম্পর্কিত ফাংশনগুলি সম্পর্কে তথ্য ফেরত দেয় তা ব্যবহার করে (দেখুন android_os_Debug.cpp )
  • Debug.getMemoryInfo()- কাজ করে কিন্তু এটি খুব ধীর। একক কলের জন্য এটি Nexus 6 এ প্রায় 200ms সময় নেয় । পারফরম্যান্স ওভারহেড এই ফাংশনটি আমাদের জন্য অকেজো করে তোলে কারণ আমরা এটি নিয়মিত কল করি এবং প্রতিটি কলই যথেষ্ট লক্ষণীয় ( অ্যান্ড্রয়েড_স_দেবগ.সিপি দেখুন )
  • ActivityManager.getProcessMemoryInfo(int[])- Debug.getMemoryInfo()অভ্যন্তরীণ কল ( অ্যাক্টিভিটিম্যানেজারসেবা.জভা দেখুন )

অবশেষে, আমরা নিম্নলিখিত কোড ব্যবহার করে শেষ করেছি:

const long pageSize = 4 * 1024; //`sysconf(_SC_PAGESIZE)`
string stats = File.ReadAllText("/proc/self/statm");
var statsArr = stats.Split(new [] {' ', '\t', '\n'}, 3);

if( statsArr.Length < 2 )
    throw new Exception("Parsing error of /proc/self/statm: " + stats);

return long.Parse(statsArr[1]) * pageSize;

এটি ভিএমআরএসএস মেট্রিক ফেরত দেয় । আপনি এটি সম্পর্কে আরও বিশদ এখানে পেতে পারেন: এক , দুই এবং তিন


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

Debug.MemoryInfo memInfo = new Debug.MemoryInfo();
Debug.getMemoryInfo(memInfo);
long res = memInfo.getTotalPrivateDirty();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
    res += memInfo.getTotalPrivateClean(); 

return res * 1024L;

2

অ্যান্ড্রয়েড স্টুডিও In.০ এ তারা আপনার অ্যাপ্লিকেশনটি কীভাবে সিপিইউ, মেমরি, নেটওয়ার্ক এবং ব্যাটারি সংস্থান ব্যবহার করে তা বুঝতে আপনাকে সহায়তা করার জন্য অ্যান্ড্রয়েড-প্রোফাইলার চালু করেছে।

https://developer.android.com/studio/profile/android-profiler

এখানে চিত্র বর্ণনা লিখুন


1

উপরে অনেকগুলি উত্তর রয়েছে যা অবশ্যই আপনাকে সহায়তা করবে তবে (অ্যাডবি মেমরি সরঞ্জামগুলির 2 দিন সাশ্রয় ও গবেষণা করার পরে) আমি মনে করি আমি আমার মতামত নিয়েও সহায়তা করতে পারি ।

যেমন হ্যাকবড বলেছেন: সুতরাং যদি আপনি প্রতিটি প্রক্রিয়াটিতে প্রকৃত ম্যাপযুক্ত সমস্ত শারীরিক র‍্যাম গ্রহণ করতে এবং সমস্ত প্রক্রিয়া যুক্ত করে থাকেন তবে আপনি সম্ভবত আসল মোট র‌্যামের চেয়ে অনেক বেশি সংখ্যক সমাপ্ত হতে পারেন। সুতরাং আপনি প্রক্রিয়া প্রতি সঠিক পরিমাণ মেমরি পেতে উপায় নেই।

তবে আপনি কিছু যুক্তি দিয়ে এর কাছাকাছি যেতে পারেন..আমি কীভাবে বলব ..

মত কিছু এপিআই আছে android.os.Debug.MemoryInfoএবং ActivityManager.getMemoryInfo()উল্লিখিত যার উপরে আপনি ইতিমধ্যে সম্পর্কে পড়তে হচ্ছে থাকতে পারে এবং ব্যবহৃত কিন্তু আমি অন্য উপায় সম্পর্কে কথা বলতে হবে

কাজ করার জন্য প্রথমে আপনার রুট ব্যবহারকারী হওয়া দরকার। suপ্রক্রিয়া চালিয়ে রুট সুবিধার্থে কনসোলে যান এবং এটি পান output and input stream। তারপর পাস id\n (Enter) ouputstream এবং এটি প্রক্রিয়া আউটপুট লিখুন, যদি একটি inputstream ধারণকারী পাবেন uid=0, আপনি ব্যবহারকারীর রুট আছে।

এখন এখানে যুক্তিটি যা আপনি উপরের প্রক্রিয়াতে ব্যবহার করবেন

যখন আপনি প্রসেসের আউটস্পট স্ট্রিমটি আইডির \nপরিবর্তে কমান্ড (প্রকরঙ্ক, ডাম্পসিস মেমিনফো ইত্যাদি ...) পেয়ে যান inputstreamএবং পড়েন এবং স্ট্রিমটি বাইটে সংরক্ষণ করুন [], চর [] ইত্যাদি .. কাঁচা ডেটা ব্যবহার করুন এবং আপনি শেষ!!!!!

অনুমতি:

<uses-permission android:name="android.permission.FACTORY_TEST"/>

আপনি রুট ব্যবহারকারী কিনা তা পরীক্ষা করুন:

// su command to get root access
Process process = Runtime.getRuntime().exec("su");         
DataOutputStream dataOutputStream = 
                           new DataOutputStream(process.getOutputStream());
DataInputStream dataInputStream = 
                           new DataInputStream(process.getInputStream());
if (dataInputStream != null && dataOutputStream != null) {
   // write id to console with enter
   dataOutputStream.writeBytes("id\n");                   
   dataOutputStream.flush();
   String Uid = dataInputStream.readLine();
   // read output and check if uid is there
   if (Uid.contains("uid=0")) {                           
      // you are root user
   } 
}

দিয়ে আপনার আদেশ কার্যকর করুন su

Process process = Runtime.getRuntime().exec("su");         
DataOutputStream dataOutputStream = 
                           new DataOutputStream(process.getOutputStream());
if (dataOutputStream != null) {
 // adb command
 dataOutputStream.writeBytes("procrank\n");             
 dataOutputStream.flush();
 BufferedInputStream bufferedInputStream = 
                     new BufferedInputStream(process.getInputStream());
 // this is important as it takes times to return to next line so wait
 // else you with get empty bytes in buffered stream 
 try {
       Thread.sleep(10000);
 } catch (InterruptedException e) {                     
       e.printStackTrace();
 }
 // read buffered stream into byte,char etc.
 byte[] bff = new byte[bufferedInputStream.available()];
 bufferedInputStream.read(bff);
 bufferedInputStream.close();
 }
}

লগক্যাট: ফলাফল

আপনি কোনও এপিআই থেকে কিছু ক্ষেত্রে কনসোলের পরিবর্তে একক স্ট্রিংয়ের একটি কাঁচা ডেটা পাবেন, যা সংরক্ষণ করা জটিল কারণ এটি আপনাকে ম্যানুয়ালি আলাদা করতে হবে

এটি কেবল একটি চেষ্টা, যদি আমি কিছু মিস করি তবে দয়া করে আমাকে পরামর্শ দিন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.