প্রোগ্রামডমেটিকভাবে আমি কীভাবে আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে ব্যবহৃত মেমরিটি খুঁজে পেতে পারি?
আমি এটি করার একটি উপায় আছে আশা করি। এছাড়াও, আমি কীভাবে ফোনের ফ্রি মেমরি পেতে পারি?
প্রোগ্রামডমেটিকভাবে আমি কীভাবে আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে ব্যবহৃত মেমরিটি খুঁজে পেতে পারি?
আমি এটি করার একটি উপায় আছে আশা করি। এছাড়াও, আমি কীভাবে ফোনের ফ্রি মেমরি পেতে পারি?
উত্তর:
নোট করুন যে লিনাক্সের মতো আধুনিক অপারেটিং সিস্টেমগুলিতে মেমরির ব্যবহার একটি অত্যন্ত জটিল এবং বোঝার ক্ষেত্র। প্রকৃতপক্ষে আপনার সম্ভাব্যতা যা কিছু সংখ্যাই পাবেন বাস্তবে সঠিকভাবে ব্যাখ্যা করার সম্ভাবনাটি খুব কম। (আমি যখনই অন্যান্য ইঞ্জিনিয়ারদের সাথে মেমরি ব্যবহারের সংখ্যাগুলি দেখি তখন খুব সুন্দর হয়, তারা আসলে কী বোঝায় সে সম্পর্কে একটি দীর্ঘ আলোচনা হয় যা কেবলমাত্র একটি অস্পষ্ট সিদ্ধান্তে আসে))
দ্রষ্টব্য: আপনার অ্যাপ্লিকেশনটির স্মৃতি পরিচালনা করার জন্য আমাদের কাছে এখন আরও বিস্তৃত ডকুমেন্টেশন রয়েছে যা এখানে প্রচুর পরিমাণে উপাদান জুড়ে এবং অ্যান্ড্রয়েডের রাজ্যের সাথে আরও যুগোপযোগী।
প্রথম জিনিসটি সম্ভবত এই নিবন্ধটির শেষ অংশটি পড়তে হবে যাতে অ্যান্ড্রয়েডে মেমরি কীভাবে পরিচালিত হয় সে সম্পর্কে কিছুটা আলোচনা রয়েছে:
অ্যান্ড্রয়েড ২.০ দিয়ে শুরু হওয়া পরিষেবা 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 বা তার বেশি প্রয়োজন; মেমরি কিলার থেকে অ্যান্ড্রয়েড একটি নির্দিষ্ট সিস্টেমের জন্য সুরক্ষিত হয় তা নিশ্চিত করার জন্য যে ক্যাশেড র্যাম তাদের দ্বারা অত্যধিক পরিমাণে গ্রাস করা হয় তার আগে যেমন ব্যাকগ্রাউন্ডের ফলে পটভূমি প্রক্রিয়াগুলি মারা যায়।
হ্যাঁ, আপনি প্রোগ্রামিয়ালি মেমরির তথ্য পেতে পারেন এবং মেমরি নিবিড় কাজ করবেন কিনা তা স্থির করতে পারেন।
ফোন করে ভিএম হিপ আকার পান:
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 এ উত্স কোডটি পেতে পারেন
এটি একটি কাজ চলছে, তবে এটি আমি বুঝতে পারি না:
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 অবজেক্টগুলির মধ্যে কোনটিই আসলে তারা আপনাকে জানায় না যে তারা কোন পিডের সাথে যুক্ত। আপনি যদি সমস্ত পিডের একটি অ্যারে সহজেই পাস করেন তবে ফলাফলগুলি বোঝার আপনার কোনও উপায় থাকবে না। যেহেতু আমি এটির ব্যবহারটি বুঝতে পেরেছি, এটি একবারে একাধিক পিডের মধ্যে দিয়ে যাওয়া অর্থহীন করে তোলে এবং তারপরে যদি এটি হয় তবে এটি কেন এমনভাবে তৈরি করুন যাতে ক্রিয়াকলাপম্যানেজ.জেটপ্রসেস মেমরিআইএনফো () কেবলমাত্র একটি ইন্টার অ্যারে নেয়?
হ্যাকবডস স্ট্যাক ওভারফ্লোতে সেরা উত্তরগুলির মধ্যে একটি। এটি একটি খুব অস্পষ্ট বিষয়ে আলোক ছুঁড়ে দেয়। এটা আমাকে অনেক সাহায্য করেছে।
আর একটি সত্যই সহায়ক সহায়ক এটি হ'ল ভিডিওটি দেখতে হবে: গুগল আই / ও ২০১১: অ্যান্ড্রয়েড অ্যাপসের জন্য মেমরি পরিচালনা
হালনাগাদ:
প্রক্রিয়া পরিসংখ্যান, আপনার অ্যাপ্লিকেশনটি কীভাবে ব্লগ পোস্টে মেমরি পরিচালনা করে তা আবিষ্কার করার একটি পরিষেবা প্রক্রিয়া পরিসংখ্যান: আপনার অ্যাপ কীভাবে ডায়ান হ্যাকোবার দ্বারা র্যাম ব্যবহার করে তা বোঝা:
অ্যান্ড্রয়েড স্টুডিও 0.8.10+ মেমরি মনিটর নামে একটি অবিশ্বাস্যভাবে কার্যকর সরঞ্জাম চালু করেছে ।
এটি কি জন্য ভাল:
- কোনও গ্রাফে উপলব্ধ এবং ব্যবহৃত মেমরি এবং সময়ের সাথে আবর্জনা সংগ্রহের ইভেন্টগুলি দেখানো হচ্ছে।
- অ্যাপ্লিকেশন স্লোনেস অতিরিক্ত আবর্জনা সংগ্রহের ইভেন্টগুলির সাথে সম্পর্কিত কিনা তাড়াতাড়ি পরীক্ষা করা testing
- অ্যাপ ক্র্যাশগুলির স্মৃতিশক্তি শেষ হওয়ার সাথে সম্পর্কিত হতে পারে কিনা তাড়াতাড়ি পরীক্ষা করা।
চিত্র 1. অ্যান্ড্রয়েড মেমরি মনিটরে একটি জিসি (আবর্জনা সংগ্রহ) ইভেন্ট জোর করে
এটি ব্যবহার করে আপনার অ্যাপের র্যামের রিয়েল-টাইম খরচ সম্পর্কে আপনার প্রচুর ভাল তথ্য থাকতে পারে।
1) আমি অনুমান করি না, অন্তত জাভা থেকে নয়।
2)
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
MemoryInfo mi = new MemoryInfo();
activityManager.getMemoryInfo(mi);
Log.i("memory free", "" + mi.availMem);
আমরা খুঁজে পেয়েছি যে বর্তমান প্রক্রিয়াটির মোট স্মৃতি পাওয়ার সমস্ত স্ট্যান্ডার্ড পদ্ধতিতে কিছু সমস্যা আছে।
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;
অ্যান্ড্রয়েড স্টুডিও In.০ এ তারা আপনার অ্যাপ্লিকেশনটি কীভাবে সিপিইউ, মেমরি, নেটওয়ার্ক এবং ব্যাটারি সংস্থান ব্যবহার করে তা বুঝতে আপনাকে সহায়তা করার জন্য অ্যান্ড্রয়েড-প্রোফাইলার চালু করেছে।
https://developer.android.com/studio/profile/android-profiler
উপরে অনেকগুলি উত্তর রয়েছে যা অবশ্যই আপনাকে সহায়তা করবে তবে (অ্যাডবি মেমরি সরঞ্জামগুলির 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();
}
}
আপনি কোনও এপিআই থেকে কিছু ক্ষেত্রে কনসোলের পরিবর্তে একক স্ট্রিংয়ের একটি কাঁচা ডেটা পাবেন, যা সংরক্ষণ করা জটিল কারণ এটি আপনাকে ম্যানুয়ালি আলাদা করতে হবে ।
এটি কেবল একটি চেষ্টা, যদি আমি কিছু মিস করি তবে দয়া করে আমাকে পরামর্শ দিন