কিভাবে একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন হিপ আকার বাড়াতে?


125

আমি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন লিখছি যা বেশ কয়েকটি 3D মডেল ব্যবহার করে। টেক্সচার সহ এমন একটি মডেল প্রচুর স্মৃতি নিতে পারে। আমি জানতে পেরেছি যে অ্যাপ্লিকেশনটি ব্যবহার করতে পারে এমন হিপ সাইজের নির্ধারক একটি সীমা নির্ধারণ করে। উদাহরণস্বরূপ আমার ট্যাবলেট স্যামসং গ্যালাক্সি ট্যাব 8.9 P7310 মেমরির 64MB নিতে পারে up

কোনও অ্যাপ্লিকেশন ব্যবহার করতে পারে এমন মেমরির আকার বাড়ানোর কোনও উপায় আছে কি?

উত্তর:


210

আপনি অ্যান্ড্রয়েড ব্যবহার করতে পারেন : লার্জহীপ = "সত্য"বৃহত্তর স্তূপ আকারের অনুরোধ তবে এটি কোনও প্রাক হানিকম্ব ডিভাইসে কাজ করবে না। প্রাক 2.3 ডিভাইসে, আপনি ভিএমআরটাইম ক্লাসটি ব্যবহার করতে পারেন তবে এটি জিঞ্জারব্রেড এবং উপরের কাজ করবে না।

যতটা সম্ভব সীমাবদ্ধতার একমাত্র উপায় হ'ল এনডিকে দিয়ে মেমরি নিবিড় কাজগুলি করা, কারণ এনডিকে এসডিকে-র মতো মেমরি সীমা চাপায় না।

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


এনডিকে আকর্ষণীয় দেখাচ্ছে। এসডিকে দিয়ে ইতিমধ্যে লিখিত আমার কোডের সাথে আমি কী এটি ব্যবহার করতে পারি?
কুকি

3
এটি আপনার কী কোডের উপর সম্পূর্ণ নির্ভর করে। আমি এনডিকে নিয়ে বিশেষজ্ঞ নই, এবং কেবলমাত্র বেসিকগুলিই জানি। আমি আপনাকে অ্যান্ড্রয়েড-এনডিকে গুগল গ্রুপে আপনার কোডের বিবরণ সহ এই প্রশ্নটি জিজ্ঞাসা করার সুপারিশ করব বা অ্যানড্রয়েড-এনডিপি ট্যাগ দিয়ে এই সম্পর্কিত একটি নতুন প্রশ্ন পোস্ট করুন।
রাঘব সূদ

আমি অবাক হয়েছি যদি আমরা প্রশ্নের আরও নির্দিষ্ট উত্তর হিসাবে ইউনিটি 3 ডি ব্যবহার করতে না পারি ("বেশ কয়েকটি থ্রিডি মডেল ব্যবহার করে") ... unityক্য এনডিকে ব্যবহার করে কিনা সে সম্পর্কে দ্রুত কোনও সুস্পষ্ট প্রমাণ খুঁজে পাওয়া যায়নি।
ক্রেগক্স

3
largeHeap=trueFTW এর
লুইস Artola

2
অ্যান্ড্রয়েড এপিআই এর বিকাশকারীরা সত্যিই মজার, তারা কি আপনাকে আরও হিপ চান? ঠিক আছে এটির জন্য অনুরোধ করুন, এটি কেবল তাদের প্রয়োজন যাদের জন্য ... ইতিমধ্যে প্রতিটি বিকাশকারী অ্যাপ্লিকেশনটি তৈরির সময় এটিকে যুক্ত করা প্রথম জিনিস হিসাবে যুক্ত করছে :)
AndroidLover

110

কোনও অ্যাপ্লিকেশন ব্যবহার করতে পারে এমন মেমরির আকার বাড়ানোর কোনও উপায় আছে কি?

এপিআই শ্রেনী 11+ চলমান অ্যাপ্লিকেশন থাকতে পারে android:largeHeap="true"উপর <application>একটি বৃহত্তর তুলনায়-স্বাভাবিক গাদা আকার অনুরোধ করতে ম্যানিফেস্টে উপাদান, এবং getLargeMemoryClass()উপর ActivityManagerআপনাকে বলতে হবে কত বড় যে গাদা। যাহোক:

  1. এটি কেবলমাত্র API স্তর 11+ (যেমন, মধুচক্র এবং এর বাইরে) এ কাজ করে

  2. বড় বড় স্তূপ কত হবে তার কোনও গ্যারান্টি নেই

  3. ব্যবহারকারী আপনার বৃহত্তর হিপ অনুরোধটি বুঝতে পারবেন, কারণ এটি তাদের অন্যান্য অ্যাপ্লিকেশনগুলিকে র‌্যামের বাইরে রাখতে বাধ্য করবে কারণ আপনার বড় গাদা দ্বারা ব্যবহারের জন্য সিস্টেম র‌্যাম মুক্ত করতে অন্যান্য অ্যাপ্লিকেশনগুলির প্রক্রিয়াগুলি বন্ধ করে দেবে

  4. # 3 এর কারণে এবং আমি আশা করি যে android:largeHeapএটির অপব্যবহার করা হবে, ভবিষ্যতে এর জন্য সমর্থন পরিত্যাগ করা যেতে পারে, বা ইনস্টলার সময় ব্যবহারকারীকে এ সম্পর্কে সতর্ক করা যেতে পারে (যেমন, আপনাকে এটির জন্য একটি বিশেষ অনুমতিের জন্য অনুরোধ করতে হবে )

  5. বর্তমানে, এই বৈশিষ্ট্যটি হালকাভাবে ডকুমেন্টেড রয়েছে


@ কমন্সওয়্যার যদি বড় হিপ না পাওয়া যায় তবে আমি কীভাবে পূর্বে লোড হওয়া জিনিসগুলি (চিত্রগুলির মতো) সরিয়ে ফেলতে পারি?
জিওংবিবস

@ মিগুয়েলরিভেরা: চিত্রগুলির জন্য, আদর্শভাবে আপনি তাদের স্মৃতি পুনর্ব্যবহার inBitmapকরুন (দেখুন BitmapOptions)। এর বাইরে, তাদের সমস্ত উল্লেখ মুছে ফেলুন এবং শেষ পর্যন্ত তারা আবর্জনা-সংগৃহীত পাবেন।
কমন্সওয়্যার

এবং আপনি কি সিদ্ধান্ত প্রস্তাব?
গেনাদি রেয়াবকিন

@ জাস্ট: আপনি কী উল্লেখ করছেন তা আমি জানি না, দুঃখিত।
কমন্সওয়েয়ার

2
@ ইফতেখারী: সরাসরি আপনার অ্যাপের জন্য নয়। আরও স্টাফ থাকা আপনাকে সেই স্টাফ দিয়ে যাওয়ার জন্য আরও সিপিইউ সময় কাটাতে পারে, তবে সেখানকার বিবরণগুলি আপনি মেমরির সাথে কী করছেন তার উপর নির্ভর করবে এবং অনুরোধ করার সাথে সরাসরি বাঁধা নেই android:largeHeap। যাইহোক, একটি বড় গাদা অনুরোধ করা সামগ্রিকভাবে ব্যবহারকারীদের অভিজ্ঞতার ক্ষতি করতে পারে, অন্য অ্যাপ্লিকেশন প্রক্রিয়াগুলি অন্যথায় প্রয়োজন হওয়ার চেয়ে আগে শেষ করতে বাধ্য করে by
কমন্সওয়্যার

22

আপনি গতির আকারটি গতিশীলভাবে বাড়িয়ে তুলতে পারবেন না।

আপনি android:largeHeap="true"ম্যানিফেস্টে ব্যবহার করে আরও ব্যবহারের জন্য অনুরোধ করতে পারেন ।

এছাড়াও, আপনি ব্যবহার করতে পারেন native memory (NDK & JNI) , যাতে আপনি আসলে গাদা আকার সীমাবদ্ধতা বাইপাস।

আমি এটি সম্পর্কে কিছু পোস্ট এখানে লিখেছি:

এবং এখানে এটির জন্য আমি তৈরি করেছি একটি লাইব্রেরি:


@ অ্যাপ্লিকেশন প্রতি জাভা স্তরে হিপ সীমা কি স্থানীয় এবং দেশি আলাদা? উদাহরণস্বরূপ s5 ডেভি 128 এমবি জাভা হিপ সীমা এবং নেটিভ অন্য 128 এমবি নিতে পারে?
NitZRobotKoder

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

আমি বলতে চাইছি যদি আমার অ্যাপ্লিকেশনটি নেটিভ বলুন ব্যবহার করে so অ্যান্ড্রয়েডের প্রতিটি স্তরে আলাদা স্তূপের আকার রয়েছে?
NitZRobotKoder


@ নীটজরোবটকডার নং। হিপ আকারটি জাভা / কোটলিন বিশ্বের জন্য যেখানে আপনি খুব বেশি পরিমাণে ব্যবহার করলে আপনি ওওএম ব্যতিক্রম পেতে পারেন get বাকি জন্য, এটি নেটিভ স্মৃতি।
অ্যান্ড্রয়েড বিকাশকারী

6

দ্বিতীয় প্রক্রিয়া ব্যবহার করুন। AndroidManifestনতুন Serviceদিয়ে ঘোষণা করুন

android:process=":second"

প্রথম এবং দ্বিতীয় প্রক্রিয়া ওভারের মধ্যে বিনিময় BroadcastReceiver


5

এটি আপনার অ্যান্ড্রয়েড ওএস অনুযায়ী দুটি উপায়ে করা যেতে পারে।

  1. আপনি android:largeHeap="true"বড় মাপের আকারের অনুরোধ করতে অ্যান্ড্রয়েড ম্যানিফেস্টের অ্যাপ্লিকেশন ট্যাগটিতে ব্যবহার করতে পারেন তবে এটি কোনও প্রাক হানিকম্ব ডিভাইসে কাজ করবে না।
  2. প্রাক 2.3 ডিভাইসে, আপনি ভিএমআরটাইম ক্লাসটি ব্যবহার করতে পারেন তবে এটি জিঞ্জারব্রেড এবং তার থেকে উপরে কাজ করবে না এটি কীভাবে করবেন তা নীচে দেখুন।
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);

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

তথ্যসূত্র: http://dwij.co.in/increase-heap-size-of-android-application


4
সুতরাং স্পষ্টতই, <2.3 এর একটি উপায় আছে, এবং> ২.৩ এর একটি উপায় আছে, তবে ২.৩ স্ক্রু হয়েছে!
মাইকেল

3

আমি যা মনে করি তা থেকে আপনি ব্যবহার করতে পারেন VMRuntime আপনি প্রারম্ভিক অ্যান্ড্রয়েড সংস্করণগুলিতে ক্লাস তবে এখন আপনি আর পারবেন না।

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


0

জাভা হিপ বাড়ানো অভাবজনকভাবে ঘাটতি মোবাইল পুনরায় খায়। কখনও কখনও কেবল আবর্জনা সংগ্রহকারীর জন্য অপেক্ষা করা যথেষ্ট এবং পর্যাপ্ত পরিমাণ হ্রাস হওয়ার পরে আপনার কার্যক্রম শুরু করুন sufficient তখন এই স্থির পদ্ধতিটি ব্যবহার করুন Use

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