কোনও অ্যাপ্লিকেশন সর্বোচ্চ কত পরিমাণ র‍্যাম ব্যবহার করতে পারে?


145

অ্যান্ড্রয়েড অপারেটিং সিস্টেমের মেমরি পরিচালনা সম্পর্কিত এই প্রশ্নটি সম্পর্কে আমি বেশ কৌতূহল বোধ করছি তাই আমি এই বিষয়ে একটি বিশদ বিস্তৃত উত্তর আশা করি।

আমি কী জানতে চাই:

  • কি মেমরি সর্বোচ্চ পরিমাণ (ইন মেগাবাইটে / যেমন শতাংশ মোট RAM এর) যে একটি Android অ্যাপ্লিকেশন (একটি সিস্টেম অ্যাপ্লিকেশান নয়) ব্যবহার করতে পারি?
  • অ্যান্ড্রয়েড সংস্করণগুলির মধ্যে কি কোনও পার্থক্য রয়েছে ?
  • ডিভাইসটির প্রস্তুতকারক সম্পর্কে কোনও পার্থক্য রয়েছে কি?

এবং সবচেয়ে গুরুত্বপূর্ণ:

  • কি বিবেচনা করা হয় / কি এটা উপর নির্ভর করে নেই যখন এটি সিস্টেমের নির্ণয় কত র্যাম একটি অ্যাপ্লিকেশন রানটাইম এ ব্যবহার করতে পারেন আসে (বলা যাচ্ছে যে অ্যাপ্লিকেশন প্রতি মেমরির সর্বোচ্চ একটি স্ট্যাটিক সংখ্যা নয়)?

আমি এখন পর্যন্ত যা শুনেছি (২০১৩ অবধি):

  • প্রাথমিক অ্যান্ড্রয়েড ডিভাইসগুলিতে 16 এমবি প্রতি অ্যাপ্লিকেশন ক্যাপ ছিল
  • পরে এই ক্যাপটি 24MB বা 32MB এ উন্নীত হয়

যা আমাকে খুব কৌতূহলী করে তোলে:

এই উভয় সীমা খুব কম।

আমি সম্প্রতি আমার ডিভাইসগুলির র‌্যাম চেক করতে অ্যান্ড্রয়েড টাস্ক ম্যানেজারটি ডাউনলোড করেছি। আমি যেটা লক্ষ্য করেছি তা হল প্রায় ৪০-g০ মেগাবাইট র‌্যাম ব্যবহার করে এমন অ্যাপ্লিকেশন রয়েছে যা 32 মেগাবাইটের উল্লিখিত সর্বাধিক র‌্যাম ব্যবহারের চেয়ে বেশি বাধ্যতামূলক। সুতরাং অ্যান্ড্রয়েড কীভাবে কোনও অ্যাপ্লিকেশনটি কতটা র‌্যাম ব্যবহার করতে পারে তা নির্ধারণ করে? অ্যাপ্লিকেশনগুলি যে সীমাটি অতিক্রম করেছে তা কীভাবে সম্ভব?

তদুপরি, আমি লক্ষ্য করেছি যে প্রায় 30-40 মেগাবাইট ব্যবহার করার সময় একটি আউটআউফমিউরি এক্সসেপশন সহ খনি ক্রাশের কিছু অ্যাপ্লিকেশন (সিস্টেম দ্বারা নিহত?) অন্যদিকে, আমার ফোনে অ্যাপ্লিকেশনগুলি চলছে কিছু সময়ের পরে (সম্ভবত মেমরি ফাঁস হওয়ার কারণে) 100 এমবি এবং আরও বেশি কিছু ব্যবহার করে চলছে যা ক্রাশ হয় না বা মারা যায়। সুতরাং কতটা র‌্যামকে বাঁচানো যায় তা নির্ধারণ করার ক্ষেত্রে এটি স্পষ্টতই অ্যাপ্লিকেশানের উপরও নির্ভর করে । এটা কিভাবে সম্ভব? (আমি 768 এমবি র‌্যাম সহ এইচটিসি ওয়ান এস দিয়ে আমার পরীক্ষা চালিয়েছি)

দাবি অস্বীকার: আমি কোনওভাবেই অ্যান্ড্রয়েড টাস্ক ম্যানেজার অ্যাপের সাথে অনুমোদিত নই।

উত্তর:


119

অ্যান্ড্রয়েড অ্যাপ্লিকেশন (যা কোনও সিস্টেম অ্যাপ নয়) সর্বোচ্চ পরিমাণে মেমোরি (মোট র্যামের শতাংশ হিসাবে) ব্যবহার করতে পারে?

এটি ডিভাইসে পরিবর্তিত হয়। আপনার কোডটি যে ডিভাইসে চলছে তার জন্য getMemoryClass()অনActivityManager আপনাকে মূল্য দেয়।

অ্যান্ড্রয়েড সংস্করণগুলির মধ্যে কি কোনও পার্থক্য রয়েছে?

হ্যাঁ, ওএসের প্রয়োজনীয়তাগুলি হিসাবে ইনসোফারগুলি বছরের পর বছর ধরে বেড়েছে, এবং ডিভাইসগুলিকে ম্যাচের জন্য সামঞ্জস্য করতে হয়েছে।

ডিভাইস প্রস্তুতকারক সম্পর্কে কি পার্থক্য আছে?

হ্যাঁ, ইনসোফার হিসাবে নির্মাতারা ডিভাইস তৈরি করে এবং আকারটি ডিভাইস অনুসারে পরিবর্তিত হয়।

কোন অ্যাপ্লিকেশনটি কতটা র‌্যাম ব্যবহার করতে পারে তা নির্ধারণের ক্ষেত্রে কোন "সাইড ফ্যাক্টরগুলি" বিবেচনায় নেওয়া হয়?

"পার্শ্ব ফ্যাক্টর" এর অর্থ কী তা আমার কোনও ধারণা নেই।

প্রারম্ভিক ডিভাইসগুলিতে 16 এমবি প্রতি অ্যাপ্লিকেশন ক্যাপ ছিল; পরবর্তী ডিভাইসগুলি এটি 24MB বা 32MB এ উন্নীত করে

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

অ্যাপ্লিকেশনগুলি যে সীমাটি অতিক্রম করেছে তা কীভাবে সম্ভব?

আপনি ধরে নিয়েছেন যে সেই অ্যাপটির লেখক জানেন যে তিনি কী করছেন s কোর অ্যান্ড্রয়েড ইঞ্জিনিয়ারের জন্য কোনও অ্যাপ্লিকেশনটির মেমরির ব্যবহার নির্ধারণ করা কঠিন বলে বিবেচনা করে আমি ধরে নেব না যে প্রশ্নে থাকা অ্যাপটি প্রয়োজনীয়ভাবে বিশেষত সঠিক ফলাফল সরবরাহ করছে।

বলা হচ্ছে, নেটিভ কোড (এনডিকে) গাদা সীমা সাপেক্ষে নয়। এবং, অ্যান্ড্রয়েড 3.0.০ থেকে অ্যাপ্লিকেশনগুলি "বড় হিপ" র জন্য অনুরোধ করতে পারে, সাধারণত শত শত এমবি পরিসরে, তবে এটি বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য দরিদ্র রূপ হিসাবে বিবেচিত হয়।

তদুপরি, আমি লক্ষ করেছি যে আমার প্রায় 30-40 মেগাবাইট ব্যবহার করার সময় একটি আউটঅফমিউরিঅ্যাক্সপশন দিয়ে ক্র্যাশ হওয়ার কিছু অ্যাপ্লিকেশন।

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


আমি টেবিল সম্পর্কে বুঝতে পারি না, আমার কাছে এক্স্পেরিয়া এক্স মোবাইল রয়েছে যার রেজোলিউশন রয়েছে প্রায় 1080 এক্স 1920 যা বড় রেজোলিউশন, এবং অন্য একটি ডিভাইস স্যামসাং ট্যাব 4 এর রেজোলিউশন 800 x 1280, সুতরাং এটি একই রাম পেশা নিন, দয়া করে আমাকে গাইড করুন কারণ মোবাইলটি আসে 3 জিবি র‌্যাম এবং ট্যাব 1.5 জিবি র‌্যামের সাথে আসে, তাই বড় স্ক্রিনের কারণে ট্যাবলেটটি বড় আকারের র‌্যাম দখল করে?
রাহুল মান্ডালিয়া

@ রাহুলমন্ডালিয়া: আমি দুঃখিত, তবে আপনার উদ্বেগ বা এই প্রশ্নের সাথে এর কী সম্পর্ক আছে তা আমি বুঝতে পারি না। আপনার উদ্বেগ কী তা আপনি বিশদে বিশদভাবে ব্যাখ্যা করার জন্য আপনি একটি পৃথক স্ট্যাক ওভারফ্লো প্রশ্ন খুলতে চাইতে পারেন।
কমন্সওয়েরে

15

এটি 2018 এর শেষ তাই বিষয়গুলি পরিবর্তিত হয়েছে।

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

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

তবে বেশিরভাগ ক্ষেত্রেই আপনার নিয়মিত অ্যান্ড্রয়েড প্রোফাইলার আপনার জন্য যথেষ্ট।

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

সাধারণত, কোনও অ্যাপ্লিকেশন 50 এমবি র‌্যাম বরাদ্দ দিয়ে শুরু হয় তবে আপনি যখন মেমরিতে কিছু ফটো লোড করতে শুরু করেন তখন তাত্ক্ষণিকভাবে 90Mb পর্যন্ত ঝাঁপিয়ে পড়ে। আপনি যখন প্রিলোড লোড ফটো (ভিউপিগার) এর সাথে প্রতিটি ভিউপ্যাজারের সাথে ক্রিয়াকলাপটি খুলেন (প্রতিটি প্রতি 3,5 এমবি) আপনি সেকেন্ডে 190Mb সহজেই পেতে পারেন।

তবে এর অর্থ এই নয় যে আপনার মেমরি পরিচালনায় সমস্যা রয়েছে।

আমি যে সর্বোত্তম পরামর্শ দিতে পারি তা হ'ল গাইডলাইন এবং সেরা অনুশীলনগুলি অনুসরণ করা, চিত্র লোডিংয়ের জন্য শীর্ষ গ্রন্থাগারগুলি ব্যবহার করুন (গ্লাইড, পিকাসো) এবং আপনি ঠিক থাকবেন।


তবে আপনাকে যদি কিছু উপস্থাপনের প্রয়োজন হয় এবং আপনার সত্যিকারের জানা দরকার যে আপনি ম্যানুয়ালি কতটা মেমরি বরাদ্দ করতে পারেন আপনি সম্পূর্ণ নিখরচায় স্মৃতি পেতে পারেন এবং এ থেকে একটি প্রাক-নির্ধারিত অংশ (% তে) গণনা করতে পারেন। আমার ক্ষেত্রে, ডিক্রিপ্ট করা ফটোগুলিকে মেমরির মধ্যে ক্যাশে করা দরকার ছিল তাই তালিকার মাধ্যমে প্রতিটি ব্যবহারকারী স্লাইডগুলি ডিক্রিপ্ট করার দরকার নেই don't

এই উদ্দেশ্যে আপনি LruCache ক্লাস ব্যবহারের জন্য প্রস্তুত ব্যবহার করতে পারেন । এটি একটি ক্যাশে শ্রেণি যা স্বয়ংক্রিয়ভাবে আপনার বস্তুগুলি কত মেমরি বরাদ্দ করে তা ট্র্যাক করে (বা উদাহরণগুলির সংখ্যা) এবং তাদের ব্যবহারের ইতিহাসের দ্বারা সাম্প্রতিকতম রাখার জন্য প্রাচীনতমটিকে সরিয়ে দেয়। এটি কীভাবে ব্যবহার করবেন সে সম্পর্কে একটি দুর্দান্ত টিউটোরিয়াল এখানে

আমার ক্ষেত্রে, আমি ক্যাশেগুলির 2 টি উদাহরণ তৈরি করেছি: থাম্ব এবং সংযুক্তির জন্য। তাদের সিঙ্গেলটন অ্যাক্সেসের সাথে স্থিতিশীল করে তোলে যাতে তারা অ্যাপ্লিকেশন জুড়ে বিশ্বব্যাপী উপলব্ধ।

ক্যাশে ক্লাস:

public class BitmapLruCache extends LruCache<Uri, byte[]> {

    private static final float CACHE_PART_FOR_THUMBS_PRC = 0.01f; // 1% (Nexus 5X - 5Mb)
    private static final float CACHE_PART_FOR_ATTACHMENTS_PRC = 0.03f;// 3% (Nexus 5X - 16Mb)
    private static BitmapLruCache thumbCacheInstance;
    private static BitmapLruCache attachmentCacheInstance;

public static synchronized BitmapLruCache getDecryptedThumbCacheInstance() {
    if (thumbCacheInstance == null) {

        int cacheSize = getCacheSize(CACHE_PART_FOR_THUMBS_PRC);
    //L.log("creating BitmapLruCache for Thumb with size: " + cacheSize + " bytes");
        thumbCacheInstance = new BitmapLruCache(cacheSize);
        return thumbCacheInstance;
    } else {
        return thumbCacheInstance;
    }
}

public static synchronized BitmapLruCache getDecryptedAttachmentCacheInstance() {
    if (attachmentCacheInstance == null) {

        int cacheSize = getCacheSize(CACHE_PART_FOR_ATTACHMENTS_PRC);
    //            L.log("creating BitmapLruCache for Attachment with size: " + cacheSize + " bytes");
        attachmentCacheInstance = new BitmapLruCache(cacheSize);
        return attachmentCacheInstance;
    } else {
        return attachmentCacheInstance;
    }
}

private BitmapLruCache(int maxSize) {
    super(maxSize);
}

public void addBitmap(Uri uri, byte[] bitmapBytes) {
    if (get(uri) == null && bitmapBytes != null)
        put(uri, bitmapBytes);
}

public byte[] getBitmap(Uri uri) {
    return get(uri);
}


@Override
protected int sizeOf(Uri uri, byte[] bitmapBytes) {
    // The cache size will be measured in bytes rather than number of items.
    return bitmapBytes.length;
}
}

এইভাবে আমি উপলব্ধ নিখরচায় র‍্যাম গণনা করি এবং এর থেকে আমি কতটা কামড় দিতে পারি:

private static int getCacheSize(float partOfTotalFreeMemoryToUseAsCache){
    final long maxMemory = Runtime.getRuntime().maxMemory();
    //Use ... of available memory for List Notes thumb cache
    return (int) (maxMemory * partOfTotalFreeMemoryToUseAsCache);
}

ক্যাশেড চিত্র পেতে আমি এটি অ্যাডাপ্টারে এইভাবে ব্যবহার করি:

byte[] decryptedThumbnail = BitmapLruCache.getDecryptedThumbCacheInstance().getBitmap(thumbUri);

এবং আমি কীভাবে এটি ব্যাকগ্রাউন্ড থ্রেডে ক্যাশে সেট করব (নিয়মিত AsyncTask):

BitmapLruCache.getDecryptedThumbCacheInstance().addBitmap(thumbUri, thumbBytes); 

আমার অ্যাপ্লিকেশন টিআইপি 19+ টার্গেট করে যাতে ডিভাইসগুলি পুরানো হয় না এবং উপলব্ধ র‌্যামের এই অংশগুলি আমার ক্ষেত্রে ক্যাশের জন্য যথেষ্ট (1% এবং 3%)।

মজাদার ঘটনা: আপনার অ্যাপ্লিকেশনটিতে বরাদ্দকৃত মেমরির পরিমাণ পাওয়ার জন্য অ্যান্ড্রয়েডের কোনও এপিআই বা অন্যান্য হ্যাক নেই, এটি বিভিন্ন কারণের ভিত্তিতে ফ্লাইতে গণনা করা হয়।


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


12

স্ক্রিন আকার এবং অ্যান্ড্রয়েড সংস্করণের উপর নির্ভর করে প্রতি অ্যাপ্লিকেশনটির মেমরি সীমাবদ্ধতাগুলি এখানে রয়েছে: https://drive.google.com/file/d/0B7Vx1OvzrLa3Y0R0X1BZbUpicGc/view?usp=sharing

উত্স: অ্যান্ড্রয়েড সামঞ্জস্যতা ডাউনলোডগুলি http://source.android.com/compatibility/downloads.html ; সামঞ্জস্যতা সংজ্ঞা দলিল (সিডিডি), বিভাগ ভার্চুয়াল মেশিনের সামঞ্জস্য বা রানটাইম সামঞ্জস্য


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