অ্যান্ড্রয়েড ১৭ এবং এর পরবর্তী সংস্করণগুলো মেমরি লিমিটার সমর্থন করে, যা একটি সিস্টেম সার্ভিস। এটি লিনাক্স সিগ্রুপ ভি২ (Linux cgroup v2) ব্যবহার করে অ্যাপ্লিকেশন প্রসেসগুলোর মেমরি ব্যবহার পর্যবেক্ষণ ও সীমিত করে। মেমরি লিমিটার কোনো নির্দিষ্ট অ্যাপকে অতিরিক্ত সিস্টেম মেমরি ব্যবহার করা থেকে বিরত রাখে, যা সিস্টেম-ব্যাপী মেমরির চাপ কমায় এবং গুরুত্বপূর্ণ প্রসেসগুলোকে মেমরি শেষ হয়ে যাওয়ার (OOM) কারণে হঠাৎ বন্ধ হয়ে যাওয়া থেকে রক্ষা করে।
প্রক্রিয়া
মেমরি লিমিটার প্রসেস লাইফসাইকেল ইভেন্ট এবং অবস্থার পরিবর্তন ট্র্যাক করার জন্য অ্যাক্টিভিটি ম্যানেজার সার্ভিস (AMS)-এর সাথে সমন্বিতভাবে কাজ করে। মেমরি লিমিটার লিনাক্স কার্নেলের cgroup v2 ফাইল সিস্টেম ব্যবহার করে মেমরির সীমা প্রয়োগ করে।
মেমরি লিমিটার ব্যবহার করার জন্য, ডিভাইস কার্নেলকে অবশ্যই সিগ্রুপ ভি২ (cgroup v2) এবং memory কন্ট্রোলার সমর্থন করতে হবে। এই পরিষেবাটি বিশেষভাবে নিম্নলিখিত অ্যাট্রিবিউটগুলোর উপর নির্ভর করে:
-
memory.high - একটি নমনীয় সীমা। এটি অতিক্রম করলে, প্রসেসটির গতি কমিয়ে দেওয়া হয় এবং কার্নেল এর থেকে মেমরি পুনরুদ্ধার করার চেষ্টা করে।
-
memory.swap.max - প্রসেসটি যে পরিমাণ সোয়াপ স্পেস ব্যবহার করতে পারে, তা সীমিত করে।
অ্যাপের উপর প্রভাব
যেসব অ্যাপ তাদের মেমোরির সীমা অতিক্রম করে না, সেগুলো মেমোরি লিমিটার দ্বারা প্রভাবিত হয় না।
যখন কোনো অ্যাপ তার memory.high সীমা অতিক্রম করে, তখন অ্যাপটিকে সীমার মধ্যে রাখার জন্য কার্নেল অ্যাপটির ফাইল-ব্যাকড মেমরি সরিয়ে দেয় এবং এর অ্যানোনিমাস মেমরি সোয়াপ আউট করে। এই অপসারণ এবং সোয়াপের ফলে অ্যাপটি ধীরগতিতে চলতে পারে।
চরম ক্ষেত্রে, যদি অ্যাপটি ক্রমাগত অ্যানোনিমাস মেমরি বরাদ্দ করতে থাকে এবং ডিভাইসের সোয়াপ স্পেস শেষ হয়ে যায়, তাহলে অ্যাপটি মেমরি বরাদ্দ করতে ব্যর্থ হতে পারে এবং ফলস্বরূপ ক্র্যাশ করার সম্ভাবনা থাকে।
প্রক্রিয়া পর্যবেক্ষণ
মেমরি লিমিটার ডিফল্টরূপে অ্যাপ প্রসেসগুলোকে (UID >= 10000) মনিটর করে। কোর সিস্টেমের স্থিতিশীলতা যাচাই করার সুবিধার্থে সিস্টেম প্রসেসগুলোকে সাধারণত এর আওতামুক্ত রাখা হয়।
মেমরি লিমিটার প্রসেসের অবস্থার উপর ভিত্তি করে মেমরির সীমা নির্ধারণ করে:
দৃশ্যমান প্রসেসগুলো ব্যবহারকারীর কাছে বোধগম্য হয়, যেমন ফোরগ্রাউন্ড অ্যাক্টিভিটি, ফোরগ্রাউন্ড সার্ভিস বা অন্যান্য জ্যাঙ্ক-বোধগম্য অবস্থা।
অদৃশ্য প্রসেস হলো এমন ব্যাকগ্রাউন্ড প্রসেস যা ব্যবহারকারীর সাথে কোনো মিথস্ক্রিয়া করে না বা ব্যবহারকারীর কাছে দৃশ্যমান নয়।
নিম্নলিখিত সারণীটি নির্দিষ্ট প্রসেস অবস্থাগুলোকে মেমরি সীমার সাথে সংযুক্ত করে:
| প্রক্রিয়া অবস্থা | মেমরি সীমা |
|---|---|
PERSISTENT | অবাধ |
PERSISTENT_UI | অবাধ |
TOP | দৃশ্যমান |
BOUND_TOP | দৃশ্যমান |
FOREGROUND_SERVICE | দৃশ্যমান নয় |
BOUND_FOREGROUND_SERVICE | দৃশ্যমান নয় |
IMPORTANT_FOREGROUND | দৃশ্যমান |
IMPORTANT_BACKGROUND | দৃশ্যমান নয় |
TRANSIENT_BACKGROUND | দৃশ্যমান নয় |
BACKUP | দৃশ্যমান নয় |
SERVICE | দৃশ্যমান নয় |
RECEIVER | দৃশ্যমান নয় |
TOP_SLEEPING | দৃশ্যমান |
HEAVY_WEIGHT | দৃশ্যমান নয় |
HOME | দৃশ্যমান নয় |
LAST_ACTIVITY | দৃশ্যমান নয় |
CACHED_ACTIVITY | ক্যাশ করা হয়েছে |
CACHED_ACTIVITY_CLIENT | ক্যাশ করা হয়েছে |
CACHED_RECENT | ক্যাশ করা হয়েছে |
CACHED_EMPTY | ক্যাশ করা হয়েছে |
ক্যাশড অবস্থায়, প্রসেসগুলো প্রথমে স্থির থাকে এবং তারপর সর্বোচ্চ পরিমাণে পুনরুদ্ধার করা হয়।
যখন কোনো প্রসেস তার জন্য নির্ধারিত memory.high সীমা অতিক্রম করে, তখন মেমরি লিমিটার ঘটনাটি শনাক্ত করে এবং ডিবাগিং কার্যক্রম শুরু করতে পারে, যেমন মেমরি প্রোফাইল ক্যাপচার করা বা statsd এ কোনো অস্বাভাবিকতা লগ করা।
কনফিগারেশন
vendor পার্টিশনে অবস্থিত একটি XML ফাইল ব্যবহার করে মেমরি লিমিটারটি কনফিগার করুন। এই কনফিগারেশন আপনাকে ডিভাইসের নির্দিষ্ট মেমরি সীমাবদ্ধতার উপর ভিত্তি করে পরম মেমরি সীমা নির্ধারণ করতে দেয়।
ফাইলের পথ:
/vendor/etc/memory-limiter-config.xmlডিফল্ট কনফিগারেশন: যদি কনফিগারেশন ফাইলটি খুঁজে না পাওয়া যায়, অথবা যদি এটি অপাঠ্য বা অবৈধ হয়, তাহলে মেমরি লিমিটার নিষ্ক্রিয় থাকে।
XML ফরম্যাট
কনফিগারেশন ফাইলটি memory-limiter-config.xsd এ সংজ্ঞায়িত স্কিমা অনুসরণ করে। এই ফাইলটি আপনাকে একাধিক লিমিট সেট নির্ধারণ করার সুযোগ দেয়; সার্ভিসটি ডিভাইসের উপলব্ধ র্যামের উপর ভিত্তি করে সেরা মিলটি বেছে নেয়। সমস্ত মেমরি ভ্যালু মেবিবাইট (MiB) এককে সংজ্ঞায়িত করা হয়।
<MemoryLimiterConfig>
<version>1</version>
<configList>
<limitSet>
<!-- Limits for a phone with at least 14G of ram: 8G/4G/4G/4G -->
<minimumRequiredMemTotal>14336</minimumRequiredMemTotal>
<memVisible>8192</memVisible>
<memNotVisible>4096</memNotVisible>
<swapVisible>4096</swapVisible>
<swapNotVisible>4096</swapNotVisible>
</limitSet>
</configList>
</MemoryLimiterConfig>
-
version - কনফিগারেশন সংস্করণ শনাক্তকারী একটি ধনাত্মক পূর্ণসংখ্যা। এটি অবশ্যই ১ হতে হবে।
-
minimumRequiredMemTotal - এই সীমা নির্ধারণটি বৈধ হওয়ার জন্য ন্যূনতম প্রয়োজনীয় সিস্টেম মেমরি।
-
memVisible - মেমরি সীমা (
memory.high) দৃশ্যমান প্রসেসগুলোর জন্য অনুমতি দিয়েছে। -
memNotVisible - মেমোরি লিমিটের (
memory.high) কারণে প্রসেসগুলো দৃশ্যমান ছিল না। -
swapVisible - দৃশ্যমান প্রসেসগুলোর জন্য অনুমোদিত সোয়াপ সীমা (
memory.swap.max)। -
swapNotVisible - সোয়াপ সীমা (
memory.swap.max) অদৃশ্য প্রসেসগুলোর জন্য অনুমোদিত ছিল।
কনফিগারেশন পরিবর্তন করুন
সিস্টেম-ব্যাপী সীমা পরিবর্তন করতে, এই ধাপগুলো অনুসরণ করুন:
-
/vendor/etc/memory-limiter-config.xmlপরিবর্তন করুন। - পরিবর্তনগুলি কার্যকর করার জন্য ডিভাইসটি রিবুট করুন অথবা
system_serverরিস্টার্ট করুন।
শেল কমান্ড
am memory-limiter কমান্ডটি আপনাকে এবং ডেভেলপারদেরকে ডেভেলপমেন্ট ও টেস্টিংয়ের জন্য রান টাইমে সার্ভিসটির সাথে ইন্টারঅ্যাক্ট করার সুযোগ দেয়:
am memory-limiter <SUB-COMMAND>অবস্থা
status সাব-কমান্ডটি মেমরি লিমিটারের কার্যক্ষম অবস্থা প্রতিবেদন করে:
adb shell am memory-limiter statusউদাহরণ আউটপুট:
Memory limiter
enabled monitoring=true ignored=none
visibleMem=1948MB visibleSwap=974MB
notVisibleMem=974MB notVisibleSwap=487MB
started=36 watched=36 watch-failed=0
events=0 processes=36 process-hwm=36
আউটপুটের প্রধান ফিল্ডগুলো হলো:
-
monitoring - লিমিটারটি সক্রিয়ভাবে প্রসেসগুলো পর্যবেক্ষণ করছে কিনা তা নির্দেশ করে।
-
visibleMemএবংnotVisibleMem - প্রতিটি স্টেটের জন্য গণনাকৃত পরম মেমরি সীমা নির্দেশ করুন।
-
events - একটি প্রক্রিয়া যতবার তার সীমা অতিক্রম করেছে তার সংখ্যা।
-
processes - পর্যবেক্ষণাধীন প্রসেসগুলোর সংখ্যা।
উপেক্ষা করুন
' ignore ' সাব-কমান্ডটি সাময়িকভাবে একটি UID বা সমস্ত প্রসেসকে সীমাবদ্ধতার আওতা থেকে বাদ দেয়। এই পদক্ষেপটি পারফরম্যান্স পরীক্ষার জন্য অথবা কোনো নির্দিষ্ট অ্যাপকে তার সীমা অতিক্রম করার অনুমতি দেওয়ার ক্ষেত্রে উপযোগী।
adb shell am memory-limiter ignore 10087 // Ignore a specific UIDadb shell am memory-limiter ignore all // Ignore all processes (effectively disables limiting)adb shell am memory-limiter ignore none // Resume normal operation
ম্যানুয়াল
manual সাব-কমান্ডটি একটি নির্দিষ্ট প্রসেসের (প্রসেস আইডি বা পিআইডি দ্বারা) জন্য গণনাকৃত সীমাগুলোকে মেগাবাইটে (MB) একটি কাস্টম পরম মান দ্বারা ওভাররাইড করে:
adb shell am memory-limiter manual 1234 1024 // Set a 1024 MB limit for PID 1234adb shell am memory-limiter manual 1234 none // Remove the manual override for PID 1234
ম্যানুয়াল ওভাররাইড শুধুমাত্র প্রসেসের জীবনচক্রের ক্ষেত্রে প্রযোজ্য। প্রসেসটি পুনরায় চালু হলে, এটি তার অবস্থার উপর ভিত্তি করে ডিফল্ট সীমাতে ফিরে আসে।