অ্যান্ড্রয়েডে অ্যাপ্লিকেশন হ্যাপের আকারটি সনাক্ত করুন


145

আপনি কীভাবে কোনও প্রোগ্রামে অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে উপলব্ধ অ্যাপ্লিকেশন হ্যাপের আকারটি সনাক্ত করতে পারেন?

শুনেছি একটি ফাংশন রয়েছে যা এসডিকে পরবর্তী সংস্করণগুলিতে এটি করে। যাই হোক না কেন, আমি সলিউশনটি খুঁজছি যা 1.5 এবং এর চেয়ে বেশি উপরে কাজ করে।


উত্তর:


453

আপনার শব্দ "অ্যাপ্লিকেশন হিপ আকার উপলব্ধ" সম্পর্কে চিন্তা করার দুটি উপায় রয়েছে:

  1. একটি হার্ড ত্রুটি ট্রিগার হওয়ার আগে আমার অ্যাপ্লিকেশনটি কত হিপ ব্যবহার করতে পারে? এবং

  2. অ্যান্ড্রয়েড ওএস সংস্করণ এবং ব্যবহারকারীর ডিভাইসের হার্ডওয়্যারগুলির সীমাবদ্ধতাগুলি বিবেচনা করে আমার অ্যাপ্লিকেশনটি কত গাদা ব্যবহার করবে?

উপরের প্রতিটি নির্ধারণের জন্য আলাদা পদ্ধতি রয়েছে।

উপরে আইটেম 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()হয় তবে এটি অনুমোদিত।


2
@ কার্ল হ্যালো কার্ল, আপনার দুর্দান্ত পোস্টের জন্য আপনাকে ধন্যবাদ। এবং আমি বিকল্প পরীক্ষা করেছি, অ্যান্ড্রয়েড: জেলিবিনের সাথে গ্যালাক্সি এস 3 এ লার্জহীপ = "সত্য"। ফলাফল এখানে। [maxMemory: 256.0MB, memoryClass: 64MB] (maxMemory largeheap বিকল্প ছাড়া 64MB ছিল না)
cmcromance

1
@ কার্ল হাহা এটি একটি বড় সম্মানের! :)
সেমিক্রোমেন্স

1
এইচটিসি ওয়ান এক্সের জন্য: সর্বাধিক স্মৃতি: 67108864 মেমরিক্লাস: 64
কিশোর

1
এলজি নেক্সাস 5 (4.4.3) (স্বাভাবিক): সর্বাধিক মেমোরি: 201326592, মেমরিক্লাস: 192 | এলজি নেক্সাস 5 (4.4.3) (বড় হিপ): সর্বাধিক স্মৃতি: 536870912, মেমরিক্লাস: 192
ian.shaun.thomas

1
খুব সুন্দর করে ডকুমেন্টেড। অ্যান্ড্রয়েড এ দয়া করে সরবরাহ করুন। আমি এ জাতীয় উপযুক্ত অ্যান্ড্রয়েড নথিটি খুঁজে পাচ্ছি না
জিমিত প্যাটেল

20

অফিসিয়াল এপিআই হ'ল:

এটি 2.0 সালে চালু হয়েছিল যেখানে বৃহত্তর মেমরি ডিভাইস উপস্থিত হয়েছিল। আপনি ধরে নিতে পারেন যে ওএসের পূর্ববর্তী সংস্করণগুলিতে চলমান ডিভাইসগুলি আসল মেমরি ক্লাস (16) ব্যবহার করছে।


13

Debug.getNativeHeapSize()কৌতুক করতে হবে, আমার মনে করা উচিত। যদিও এটি 1.0 থেকে রয়েছে।

Debugবর্গ ট্র্যাকিং বরাদ্দ এবং অন্যান্য কর্মক্ষমতা উদ্বেগ জন্য মহান পদ্ধতি প্রচুর হয়েছে। এছাড়াও, যদি আপনার স্বল্প-স্মৃতি পরিস্থিতি সনাক্ত করতে হয় তবে চেক আউট করুন Activity.onLowMemory()


ধন্যবাদ নীল ডিবাগিং বন্ধ হয়ে থাকলে অ্যাপ্লিকেশন চলমান থাকলে এই কাজ করবে?
এইচপিফিক

2
আমি এটিতে মোটামুটি নতুন, তবে আমি মনে করি না যে দেশীয় হিপটি অ্যাপটি (ডালভিক) হ্যাপের সমান যা প্রশ্নটি বোঝায়। নেটিভ হিপ বিটম্যাপ ডেটার জন্য ব্যাকিং সরবরাহ করে, যা দেশীয় কোড দ্বারা বরাদ্দ করা হয়, যখন অ্যাপ হিপ জাভা অ্যাপ্লিকেশন ডেটা ধারণ করে। আমি শিখতে আগ্রহী যে নেটিভ হিপ অ্যাপ্লিকেশন হ্যাপের সীমাতে গণনা করা হয়, এবং 3.0 এর পরে বরাদ্দগুলি আসলে অ্যাপের গাদাতে ঘটে। ডায়ান হ্যাকবর্ন (হ্যাকবড) এই বিষয়টিতে এখানে পোস্ট করেছেন: stackoverflow.com/questions/1945142/bitmaps-in-android তবে 3.0 এর জন্য অ্যাপ্লিকেশন হিপটিতে অ-দেশীয় "ডেটা" রয়েছে।
কার্ল

1
কিছু সাম্প্রতিক অ্যান্ড্রয়েড আপডেট (সম্ভবত কিটকাট ৪.৪) বিটম্যাপগুলি জেভিএম হ্যাপে রয়েছে।
akauppi

13

আপনি এটি কীভাবে করেন তা এখানে:

অ্যাপ্লিকেশনটি ব্যবহার করতে পারে এমন সর্বাধিক হিপ আকার পাওয়া:

Runtime runtime = Runtime.getRuntime();
long maxMemory=runtime.maxMemory();

আপনার অ্যাপটি বর্তমানে কতগুলি হিপ ব্যবহার করে তা পাওয়া:

long usedMemory=runtime.totalMemory() - runtime.freeMemory();

আপনার অ্যাপ্লিকেশনটি এখন কতগুলি হিপ ব্যবহার করতে পারে তা পাওয়া (উপলব্ধ মেমরি):

long availableMemory=maxMemory-usedMemory;

এবং, তাদের প্রতিটি সুন্দর বিন্যাস করতে, আপনি ব্যবহার করতে পারেন:

String formattedMemorySize=Formatter.formatShortFileSize(context,memorySize); 

5

এটি সর্বাধিক স্তরের আকার বাইটে দেয়:

Runtime.getRuntime().maxMemory()

আমি অ্যাক্টিভিটি ম্যানেজ.আরগেট মেমোরিক্লাস () ব্যবহার করছিলাম তবে সায়ানোজেনমড ((আমি অন্য কোথাও এটি পরীক্ষা করিনি) যদি ব্যবহারকারী নিজেই হিপ আকার সেট করে তবে এটি ভুল মান দেয়।


যেহেতু দস্তাবেজটি getMemoryClassবোঝা যাচ্ছে যে সংখ্যাটি আপনার ভিএম এর জন্য উপলব্ধ হাপ আকারের মতো নাও হতে পারে এবং যেহেতু ডকটি getNativeHeapSizeহ'ল ... স্বচ্ছন্দ, তাই আমি সত্যিই Runtime.getRuntime().maxMemory()সেরা উত্তর বলে মনে করি ।
BoD

3

কিছু অপারেশন জাভা হ্যাপ স্পেস ম্যানেজারের চেয়ে দ্রুত are কিছু সময়ের জন্য অপারেশন বিলম্ব করা মেমরির জায়গা মুক্ত করতে পারে। গাদা আকারের ত্রুটি থেকে বাঁচতে আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন:

waitForGarbageCollector(new Runnable() {
  @Override
  public void run() {

    // Your operations.
  }
});

/**
 * Measure used memory and give garbage collector time to free up some
 * space.
 *
 * @param callback Callback operations to be done when memory is free.
 */
public static void waitForGarbageCollector(final Runnable callback) {

  Runtime runtime;
  long maxMemory;
  long usedMemory;
  double availableMemoryPercentage = 1.0;
  final double MIN_AVAILABLE_MEMORY_PERCENTAGE = 0.1;
  final int DELAY_TIME = 5 * 1000;

  runtime =
    Runtime.getRuntime();

  maxMemory =
    runtime.maxMemory();

  usedMemory =
    runtime.totalMemory() -
    runtime.freeMemory();

  availableMemoryPercentage =
    1 -
    (double) usedMemory /
    maxMemory;

  if (availableMemoryPercentage < MIN_AVAILABLE_MEMORY_PERCENTAGE) {

    try {
      Thread.sleep(DELAY_TIME);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    waitForGarbageCollector(
      callback);
  } else {

    // Memory resources are availavle, go to next operation:

    callback.run();
  }
}

পরীক্ষিত ভাল। আপনি এই দুটি জিনিসকে বিশদভাবে বর্ণনা করতে পারেন: উপলভ্য মেমরিপেনসেন্টেজ এবং এমএটিএআইএইচআইএলবিএল_মেমোরওয়াইপিআরসিএন TAGE? কিছু ব্যাখ্যা?
নূর হোসেন

1
AvailableMemoryPercentageসূত্র অনুসারে: বর্তমানে ডিভাইসের স্মৃতি কতটা নিখরচায়। MIN_AVAILABLE_MEMORY_PERCENTAGEআপনার কাস্টম প্যারামিটারটি, এমন এক প্রান্তিক স্তর যেখানে আপনি আবর্জনা সংগ্রহকারী এর কাজ করার জন্য অপেক্ষা করতে শুরু করেছিলেন।
জোন

1

আসুস নেক্সাস 7 (2013) 32 জিগ: getMemoryClass () = 192 সর্বোচ্চ মেমোরি () = 201326592

আমি আমার গেমটি নেক্সাস on এ প্রোটোটাইপ করার ভুল করেছিলাম এবং তারপরে এটি আবিষ্কার করে আমার স্ত্রীর জেনেরিক 4.0.০৪ ট্যাবলেট (মেমোরি ক্লাস ৪৮, ম্যাক্সেমোরি ৪০৩৩১648৮) প্রায় স্মৃতি থেকে সরে যায়

আমি যখন মেমরিক্লাসটি কম নির্ধারণ করি তখন কম সংস্থান লোড করার জন্য আমার প্রকল্পটির পুনর্গঠন করা দরকার।
জাভাতে বর্তমান স্তূপের আকার দেখার কোনও উপায় আছে কি? (ডিবাগ করার সময় আমি লগগেটে এটি স্পষ্ট দেখতে পাচ্ছি, তবে আমি মানিয়ে নেওয়ার জন্য কোডটিতে এটির একটি উপায় দেখতে চাই যেমন করেন্টেপ>> (ম্যাক্সেমোরি / 2) উচ্চ মানের বিটম্যাপগুলি লোড লোড করুন


Nexus7-2013 এ বলা হয়েছে, getLargeMemoryClass () =
512.

0

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


আমি কর্মসূচী বলতে চাই। প্রশ্নটি পরিষ্কার করেছেন। ধন্যবাদ।
এইচপিফিক

1
আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি তখন এন্ড্রয়েড প্ল্যাটফর্ম প্রোগ্রামারগুলির একটি দ্বারা এই পোস্টটি দেখুন: স্ট্যাকওভারফ্লো.com
স্টিভ হ্যালি

0
Runtime rt = Runtime.getRuntime();
rt.maxMemory()

মান খ

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
am.getMemoryClass()

মান এমবি


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