আপনার শব্দ "অ্যাপ্লিকেশন হিপ আকার উপলব্ধ" সম্পর্কে চিন্তা করার দুটি উপায় রয়েছে:
একটি হার্ড ত্রুটি ট্রিগার হওয়ার আগে আমার অ্যাপ্লিকেশনটি কত হিপ ব্যবহার করতে পারে? এবং
অ্যান্ড্রয়েড ওএস সংস্করণ এবং ব্যবহারকারীর ডিভাইসের হার্ডওয়্যারগুলির সীমাবদ্ধতাগুলি বিবেচনা করে আমার অ্যাপ্লিকেশনটি কত গাদা ব্যবহার করবে?
উপরের প্রতিটি নির্ধারণের জন্য আলাদা পদ্ধতি রয়েছে।
উপরে আইটেম 1 জন্য: maxMemory()
যা নিম্নলিখিতভাবে আহবান করা যেতে পারে (যেমন আপনার মূল ক্রিয়াকলাপের onCreate()
পদ্ধতিতে):
Runtime rt = Runtime.getRuntime();
long maxMemory = rt.maxMemory();
Log.v("onCreate", "maxMemory:" + Long.toString(maxMemory));
এই পদ্ধতিটি আপনাকে জানায় যে আপনার অ্যাপ্লিকেশনটি হ্যাপের মোট মোট বাইটগুলি ব্যবহারের অনুমতিপ্রাপ্ত ।
উপরে আইটেম 2 জন্য: getMemoryClass()
যা নিম্নলিখিত হিসাবে আহ্বান করা যেতে পারে:
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
int memoryClass = am.getMemoryClass();
Log.v("onCreate", "memoryClass:" + Integer.toString(memoryClass));
এই পদ্ধতি আপনি প্রায় বলে কত মেগাবাইটে গাদা আপনার অ্যাপ্লিকেশন উচিত যদি এটা বর্তমান ডিভাইস সীমা সঠিকভাবে শ্রদ্ধাশীল হতে চায় ব্যবহার করুন, এবং অন্যান্য অ্যাপ্লিকেশন ছাড়া চালানোর অধিকার বারবার যেতে বাধ্য হচ্ছে onStop()
/ onResume()
চক্র হিসাবে তারা রূক্ষভাবে হয় আপনার হাতি অ্যাপটি অ্যান্ড্রয়েড জ্যাকুজিতে স্নান করার সময় স্মৃতি থেকে দূরে সরে গেছে।
এই পার্থক্যটি স্পষ্টভাবে নথিভুক্ত করা হয়নি, যতদূর আমি জানি, তবে আমি এই অনুমানটি পাঁচটি পৃথক অ্যান্ড্রয়েড ডিভাইসে পরীক্ষা করেছি (নীচে দেখুন) এবং আমার নিজের সন্তুষ্টির বিষয়টি নিশ্চিত করে দিয়েছি যে এটি একটি সঠিক ব্যাখ্যা।
অ্যান্ড্রয়েডের একটি স্টক সংস্করণে maxMemory()
সাধারণত একই পরিমাণ মেগাবাইটের getMemoryClass()
প্রায়শই ফিরে আসবে (যেমন, পরবর্তী মানটির প্রায় এক মিলিয়ন গুণ)।
একমাত্র পরিস্থিতি (যার সম্পর্কে আমি সচেতন) যার জন্য দুটি পদ্ধতি সায়ানোজেনমডের মতো অ্যান্ড্রয়েড সংস্করণ চালিত একটি মূল ডিভাইসে রয়েছে যা ব্যবহারকারীকে প্রতিটি অ্যাপ্লিকেশনের জন্য কত বড় একটি aੇਰ আকারের অনুমতি দেওয়া উচিত তা ম্যানুয়ালি নির্বাচন করতে দেয়। মুখ্যমন্ত্রী হিসাবে, উদাহরণস্বরূপ, এই বিকল্পটি "সায়ানোজেনমড সেটিংস" / "পারফরম্যান্স" / "ভিএম হিপ আকার" এর অধীনে উপস্থিত হয়।
দ্রষ্টব্য: এই ভ্যালুটি নির্ধারণ করে নিজেই আপনার সিস্টেমে মেসেজ করতে পারেন, আপনি যদি আপনার ডিভাইসের জন্য স্বাভাবিকের চেয়ে কম মান নির্বাচন করেন তবে অবশ্যই।
এখানে মান দ্বারা ফিরে দেখাচ্ছে আমার পরীক্ষার ফলাফল নেই maxMemory()
এবং getMemoryClass()
CyanogenMod চলমান চারটি ভিন্ন ডিভাইসের জন্য, দুটি ভিন্ন (ম্যানুয়ালি সেট) প্রত্যেকের জন্য গাদা মান ব্যবহার করছে:
- G1:
- ভিএম হিপ সাইজের সাথে 16 এমবিতে সেট করা হয়েছে:
- সর্বোচ্চতম: 16777216
- getMemoryClass: 16
- ভিএম হিপ সাইজের সাথে 24 এমবিতে সেট করা হয়েছে:
- সর্বোচ্চতম: 25165824
- getMemoryClass: 16
- মোটো ড্রয়েড:
- ভিএম হিপ সাইজের সাথে 24 এমবিতে সেট করা হয়েছে:
- সর্বোচ্চতম: 25165824
- getMemoryClass: 24
- ভিএম হিপ সাইজের সাথে 16 এমবিতে সেট করা হয়েছে:
- সর্বোচ্চতম: 16777216
- getMemoryClass: 24
- নেক্সাস ওয়ান:
- ভিএম হিপ আকারটি 32MB তে সেট করা রয়েছে:
- সর্বোচ্চতম: 33554432
- getMemoryClass: 32
- ভিএম হিপ আকারটি 24 এমবিতে সেট করা রয়েছে:
- সর্বোচ্চতম: 25165824
- getMemoryClass: 32
- ভিউসোনিক জিটিব:
- ভিএম হিপ সাইজের সাথে 32 এ সেট করা হয়েছে:
- সর্বোচ্চতম: 33554432
- getMemoryClass: 32
- ভিএম হিপ সাইজের সাথে 64 তে সেট করা হয়েছে:
- সর্বোচ্চতম: 67108864
- getMemoryClass: 32
উপরের পাশাপাশি, আমি আইসক্রিম স্যান্ডউইচ চালিত একটি নভো 7 প্যালাদিন ট্যাবলেটে পরীক্ষা করেছি। এটি মূলত আইসিএসের একটি স্টক সংস্করণ ছিল, কেবলমাত্র আমি একটি সাধারণ প্রক্রিয়াটির মাধ্যমে ট্যাবলেটটি রুট করেছি যা পুরো ওএস প্রতিস্থাপন করে না এবং বিশেষত এমন একটি ইন্টারফেস সরবরাহ করে না যা গাদা আকারটিকে ম্যানুয়ালি সামঞ্জস্য করতে দেয়।
এই ডিভাইসের জন্য, এখানে ফলাফলগুলি:
- Novo7
- সর্বোচ্চতম: 62914560
- getMemoryClass: 60
এছাড়াও (নীচে একটি মন্তব্য কিশোর প্রতি):
- এইচটিসি ওয়ান এক্স
- সর্বোচ্চতম: 67108864
- getMemoryClass: 64
এবং (প্রতি একাউপ্পির মন্তব্য):
- স্যামসাং গ্যালাক্সি কোর প্লাস
- সর্বোচ্চতম: (মন্তব্যে নির্দিষ্ট করা হয়নি)
- getMemoryClass: 48
- লজমেমোরি ক্লাস: 128
সেমিক্রোমেন্স থেকে একটি মন্তব্য:
- গ্যালাক্সি এস 3 (জেলি বিন) বড় গাদা
- সর্বোচ্চতম: 268435456
- getMemoryClass: 64
এবং (টেনসেন্টের মন্তব্যে):
- LG Nexus 5 (4.4.3) স্বাভাবিক
- সর্বোচ্চতম: 201326592
- getMemoryClass: 192
- এলজি নেক্সাস 5 (৪.৪.৩) বড় গাদা
- সর্বোচ্চতম: 536870912
- getMemoryClass: 192
- গ্যালাক্সি নেক্সাস (4.3) স্বাভাবিক
- সর্বোচ্চতম: 100663296
- getMemoryClass: 96
- গ্যালাক্সি নেক্সাস (৪.৩) বড় গাদা
- সর্বোচ্চতম: 268435456
- getMemoryClass: 96
- গ্যালাক্সি এস 4 প্লে স্টোর সংস্করণ (4.4.2) স্বাভাবিক
- সর্বোচ্চতম: 201326592
- getMemoryClass: 192
- গ্যালাক্সি এস 4 প্লে স্টোর সংস্করণ (৪.৪.২) বৃহত স্তূপ
- সর্বোচ্চতম: 536870912
- getMemoryClass: 192
অন্য যন্ত্রগুলো
- হুয়াওয়ে নেক্সাস 6 পি (6.0.1) স্বাভাবিক
- সর্বোচ্চতম: 201326592
- getMemoryClass: 192
আমি বিশেষ দুটি অ্যান্ড্রয়েড ব্যবহার করে এই দুটি পদ্ধতির পরীক্ষা করিনি: হনিকম্বের পর থেকে বৃহত্হাপ = "সত্য" ম্যানিফেস্ট বিকল্পটি উপলব্ধ, তবে সেমিক্রোমেন্স এবং টেন্যান্টের জন্য আমাদের কাছে কিছু নমুনা লার্জ হিপ মান রয়েছে, যেমন উপরে উল্লিখিত রয়েছে।
আমার প্রত্যাশা (যা উপরের বৃহত্তর সংখ্যাগুলি দ্বারা সমর্থিত বলে মনে হয়) হ'ল এই বিকল্পটির মূলত একটি মূলযুক্ত ওএসের মাধ্যমে হিপগুলি নিজেই সেট করার অনুরূপ প্রভাব ফেলতে পারে - অর্থাৎ, এটি একা maxMemory()
চলে যাওয়ার সময় এর মান বাড়িয়ে তুলবে getMemoryClass()
। আরও একটি পদ্ধতি রয়েছে, getLargeMemoryClass (), এটি নির্দেশ করে যে লার্জহীপ সেটিংসটি ব্যবহার করে কোনও অ্যাপ্লিকেশনের জন্য কতটা মেমরি অনুমোদিত allow GetLargeMemoryClass () এর জন্য ডকুমেন্টেশন বলেছে, "বেশিরভাগ অ্যাপ্লিকেশনগুলিতে এই পরিমাণ পরিমাণ মেমরির প্রয়োজন হবে না এবং পরিবর্তে getMemoryClass () সীমা থাকা উচিত।"
যদি আমি সঠিকভাবে অনুমান করে থাকি, তবে সেই বিকল্পটি ব্যবহারের ফলে একই উপকার (এবং বিপদ) যেমন কোনও ব্যবহারকারী যে শিকড়ের ওএসের সাহায্যে গাদাটি উত্তোলন করেছেন তার জন্য উপলব্ধ স্থান ব্যবহার করবে (যেমন, যদি আপনার অ্যাপ্লিকেশন অতিরিক্ত মেমরি ব্যবহার করে, এটি সম্ভবত ব্যবহারকারীরা একই সাথে চলমান অন্যান্য অ্যাপ্লিকেশনগুলির সাথে খুব সুন্দরভাবে খেলবে না)।
মনে রাখবেন মেমরি ক্লাসটি সম্ভবত 8MB এর একাধিক হওয়া দরকার না।
আমরা উপরের দিক থেকে দেখতে পাচ্ছি যে getMemoryClass()
ফলাফল কোনও প্রদত্ত ডিভাইস / ওএস কনফিগারেশনের জন্য অপরিবর্তনীয়, যখন ম্যাক্সমেমরি () মানটি ব্যবহারকারী দ্বারা পৃথকভাবে হ্যাপ সেট করার সময় পরিবর্তিত হয়।
আমার নিজের ব্যবহারিক অভিজ্ঞতাটি হ'ল জি 1 এ (যার মেমোরি ক্লাস 16 আছে) আমি যদি ম্যানুয়ালি 24MB হিপ আকার হিসাবে নির্বাচন করি তবে আমার স্মৃতি ব্যবহার 20MB এর দিকে প্রবাহিত হওয়ার অনুমতি পেলেও আমি ত্রুটি ছাড়াই চলতে পারি (সম্ভবত এটি হতে পারে) 24MB হিসাবে উচ্চতর যান, যদিও আমি এটি চেষ্টা করি নি)। তবে অন্যান্য অনুরূপ বৃহত-অ্যাপ্লিকেশন অ্যাপ্লিকেশনগুলি আমার নিজের অ্যাপ্লিকেশনটির শূকরতার ফলে স্মৃতি থেকে সজ্জিত হতে পারে। এবং, বিপরীতভাবে, যদি এই অন্যান্য উচ্চ-রক্ষণাবেক্ষণ অ্যাপ্লিকেশনটিকে ব্যবহারকারী অগ্রণীতে নিয়ে আসে তবে আমার অ্যাপ্লিকেশনটি মেমরি থেকে মুছে ফেলা হতে পারে।
সুতরাং, আপনি নির্দিষ্ট মেমরির পরিমাণ ছাড়িয়ে যেতে পারবেন না maxMemory()
। এবং, আপনার দ্বারা নির্দিষ্ট করা সীমাতে থাকার চেষ্টা করা উচিত getMemoryClass()
। এটি করার একটি উপায়, অন্য সমস্ত কিছু যদি ব্যর্থ হয় তবে স্মৃতি সংরক্ষণ করে এমন ডিভাইসের জন্য কার্যকারিতা সীমাবদ্ধ করা হতে পারে।
অবশেষে, আপনি যদি উল্লিখিত মেগাবাইটের সংখ্যাটি অতিক্রম করার পরিকল্পনা করেন তবে getMemoryClass()
আমার পরামর্শটি হ'ল আপনার অ্যাপ্লিকেশনটির রাজ্য সংরক্ষণ এবং পুনরুদ্ধার করার জন্য দীর্ঘ এবং কঠোর পরিশ্রম করা উচিত, যাতে কোনও onStop()
/ onResume()
চক্র দেখা দিলে ব্যবহারকারীর অভিজ্ঞতা কার্যত নিরবচ্ছিন্ন হয়।
আমার ক্ষেত্রে, পারফরম্যান্সের কারণে আমি আমার অ্যাপ্লিকেশনটি ২.২ বা তার বেশি চলমান ডিভাইসগুলিতে সীমাবদ্ধ করছি এবং এর অর্থ হল যে আমার অ্যাপ্লিকেশন চালিত প্রায় সমস্ত ডিভাইসে একটি মেমোরি ক্লাস 24 বা তার বেশি থাকে। সুতরাং আমি 20MB অবধি গাদা দখল করতে ডিজাইন করতে পারি এবং বেশ আত্মবিশ্বাসী বোধ করতে পারি যে ব্যবহারকারী একই সাথে চলমান অন্যান্য অ্যাপ্লিকেশনগুলির সাথে আমার অ্যাপটি দুর্দান্ত খেলবে।
তবে সবসময় এমন কয়েকটি শিকড় ব্যবহারকারী থাকবেন যারা কোনও পুরানো ডিভাইসে (যেমন, একটি জি 1) অ্যান্ড্রয়েডের একটি 2.2 বা ততোধিক সংস্করণ লোড করেছেন। আপনি যখন আদর্শ কনফিগারেশনের মুখোমুখি হন, তখন আপনার স্মৃতি ব্যবহার বন্ধ করে দেওয়া উচিত, এমনকি যদি maxMemory()
আপনাকে বলা হয় যে আপনি 16MB এর চেয়ে অনেক বেশি যেতে পারেন getMemoryClass()
যা আপনাকে লক্ষ্য করে তোলা উচিত । এবং যদি আপনি নির্ভরযোগ্যভাবে নিশ্চিত করতে না পারেন যে আপনার অ্যাপটি সেই বাজেটের মধ্যেই বেঁচে থাকবে, তবে কমপক্ষে নিশ্চিত করুন onStop()
/ onResume()
নির্বিঘ্নে কাজ করে তা নিশ্চিত করুন ।
getMemoryClass()
উপরের ডায়ান হ্যাকোবার (হ্যাকবড) দ্বারা নির্দেশিত হিসাবে, কেবলমাত্র এপিআই লেভেল 5 (অ্যান্ড্রয়েড ২.০) এ ফিরে পাওয়া যায়, এবং তাই, তিনি যেমন পরামর্শ দেন, আপনি ধরে নিতে পারেন যে ওএসের পূর্ববর্তী সংস্করণটি চালিত কোনও ডিভাইসের শারীরিক হার্ডওয়্যারটি ডিজাইন করা হয়েছে 16MB এর চেয়ে বেশি গাদা স্থান দখল করে এমন অ্যাপ্লিকেশনগুলিকে সর্বোত্তমভাবে সমর্থন করতে।
বিপরীতে, maxMemory()
, ডকুমেন্টেশন অনুযায়ী, উপলব্ধ এপিআই স্তর 1. সব পথ ফিরে এসেছে maxMemory()
, একটি প্রাক 2.0 সংস্করণের উপর, সম্ভবত একটি 16MB মান হবে, কিন্তু আমি কি করতে দেখি যে আমার (অনেক পরে) CyanogenMod সংস্করণ ব্যবহারকারী 12MB হিসাবে কম হিসাবে একটি হিপ মান নির্বাচন করতে পারে, এটি সম্ভবত কম গাদা সীমাতে ফলাফল করবে এবং তাই আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি maxMemory()
2.0 এর আগে ওএসের সংস্করণগুলির জন্যও মানটি পরীক্ষা করে চালিয়ে যাবেন । আপনাকে সম্ভবত সম্ভাব্য ইভেন্টে চালিয়ে যেতে অস্বীকার করতে হবে যে এই মানটি 16MB এর চেয়েও কম সেট করা হয়েছে, যদি আপনার ইঙ্গিতের চেয়ে বেশি সংকেত থাকতে maxMemory()
হয় তবে এটি অনুমোদিত।