লার্জহীপকে সত্যে সেট করার সুবিধা কী কী?


122

আমি প্রায় 50 টি ক্লাস সহ আমার একটি অ্যাপ রয়েছে যা android:largeHeap="true"নীচে দেখা যাবে। এটি কি একটি ভাল অনুশীলন?

<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="Mall"
        android:largeHeap="true"
        android:logo="@drawable/logo_for_up"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme" >
</application>

দয়া করে এটি ব্যবহারের জন্য সুবিধা এবং অসুবিধাগুলির পরামর্শ দিন।

আমি মেমরির সমস্যা পাচ্ছি তাই আমি এই প্রশ্নটি করি।


আপনার অ্যাপ্লিকেশনের জন্য যদি গেমস 3 মডেল ইত্যাদির মতো বড় মেমরির প্রয়োজন হয়
januprasad

47
50 ক্লাস যে অনেক না।
ক্রিস হেইস


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

4
ক্লাস সংখ্যা গুরুত্বপূর্ণ নয়। সাধারণত যা প্রচুর স্মৃতি গ্রহণ করে তা হ'ল বিটম্যাপস। " স্মৃতিতে লোড এ স্কেলড ডাউন সংস্করণ " দেখুন।
টুলমেকারস্টেভ

উত্তর:


116

এখানে পার্টির জন্য খুব দেরী হয়েছে তবে আমি আমার 0.02 offer যেভাবেই অফার করব। গুগলের কাছ থেকে পাওয়া এক্সট্র্যাক্টটি এখানে এটি
ব্যবহার করা ভাল ধারণা android:largeHeap="true" নয়,

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

এখানে ডকুমেন্টেশনের সম্পূর্ণ লিঙ্কটি https://developer.android.com/training/articles/memory.html

হালনাগাদ

উজ্জীবিতভাবে কাজ করার পরে out of memory errorsআমি বলব ওম ইস্যু এড়াতে ম্যানিফেস্টে এটি যুক্ত করা কোনও পাপ নয়, এটিও @ মিলাদ এর নীচে পয়েন্টগুলি উল্লেখ করে অ্যাপ্লিকেশনটির স্বাভাবিক কাজকে প্রভাবিত করে না

আপডেট 2

এখানে কয়েকটি হয় মোকাবেলা করতে টিপস সঙ্গেout of memory errors

1) এই কলব্যাক যা Android দেয় ব্যবহার করুন onLowMemory, onTrimMemory(int) এবং (পিকাসো, পিছলে পড়া, ফ্রেস্কো ....) আপনি তাদের সম্পর্কে আরও পড়তে পারেন মত সবগুলি চিত্রকে ক্যাশে সাফ এখানে এবং এখানে
2) কম্প্রেস আপনার ফাইল (ছবি, PDF)
3) সম্পর্কে পড়তে কীভাবে এখানে বিটম্যাপটি আরও দক্ষতার সাথে পরিচালনা করবেন
4) কোডটি মসৃণ এবং ভারী নয় তা নিশ্চিত করার জন্য উত্পাদনের আগে নিয়মিত লিঙ্ক ব্যবহার করুন


1
আপনি কেন বলছেন "এটি অ্যাপের স্বাভাবিক কাজকে প্রভাবিত করে না"? এই উত্তরটি কিছু পরিণতি আলোচনা করে। অন্য কোথাও, আমি কিছু অ্যাপ্লিকেশনগুলিতে লার্জহ্যাপ জিসির জন্য পরিমাপ করার চেয়েও খারাপ সময় দেখেছি।
টুলমেকারস্টেভ

59

আমি মনে করি এটি একটি খুব কার্যকর প্রশ্ন, এবং আমাকে এই বিকল্পটি ব্যবহার করার সুবিধা এবং অসুবিধাগুলি সম্পর্কে কিছু বিশদ যুক্ত করতে দিন add

তুমি কি পেলে :

  • স্পষ্টতই, আপনি আরও বড় গাদা পেয়েছেন, যার ঝুঁকি হ্রাস পাচ্ছে OutOfMemoryError

আপনি কি হারিয়েছেন:

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

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

উপসংহার:

largeHeapযতটা সম্ভব বিকল্প ব্যবহার করা থেকে বিরত থাকুন। এটি আপনার হার্ড-টু-নোটিশ পারফরম্যান্স ড্রপ এবং খারাপ ব্যবহারকারীর অভিজ্ঞতার জন্য ব্যয় করতে পারে।


17

আমার প্রায় 50 টি ক্লাস সহ একটি অ্যাপ রয়েছে

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

আপনি পিকাসো , ইউআইএল বা গ্লাইডের মতো চিত্র লোডিং গ্রন্থাগারগুলিও ব্যবহার করতে পারেন । তাদের সকলের মেমরি এবং / অথবা ডিস্কে চিত্রের ক্যাশে করার বৈশিষ্ট্য রয়েছে।


1
চিত্র লোডিংয়ের জন্য আমি সাধারণত পিকাসো বা সর্বজনীন চিত্র লোডার প্রস্তাব করি
মিগটিয়ান

5
গ্লাইড আরও ভাল এবং আরও কিছুটা অনুকূলিত হয়েছে তখন পিকাসো
ড্যামিয়েন প্রকা

1
@ ড্যামিয়েনপ্রা আমার মনে হয় না, কমপক্ষে আপনি যদি পিকাসোতে সঠিকভাবে ট্যাগ (সেটট্যাগ (), পজট্যাগ (), রেজিউম্যাট্যাগ ()) ব্যবহার করেন।
রুসলান বেরোজভ

15

প্রকৃতপক্ষে অ্যান্ড্রয়েড: লার্জহীপ হ'ল অ্যাপ্লিকেশনটিতে আপনার বরাদ্দ হওয়া মেমরির বৃদ্ধি।

এই পতাকাটি ব্যবহার করার প্রয়োজনীয়তার কোনও সুস্পষ্ট সংজ্ঞা নেই। আপনার যদি আরও মেমরির প্রয়োজন হয় - অ্যান্ড্রয়েড এটি বাড়ানোর জন্য একটি সরঞ্জাম সরবরাহ করে। তবে ব্যবহারের প্রয়োজনীয়তা, আপনি নিজের সংজ্ঞা দিন।


4
হ্যাঁ এখানে একটি স্পষ্ট সংজ্ঞা রয়েছে এই লিঙ্কটি ডেভেলপার.অ্যান্ড্রয়েড
ট্রেনিং

2
@ ওওয়ার_হিরো - সম্ভবত সেই নিবন্ধটি এর বিষয়বস্তু পরিবর্তন করেছে? এটিতে লার্জহীপের কোনও উল্লেখ নেই।
টুলমেকারস্টেভ

7

যদি আপনার অবশ্যই প্রচুর পরিমাণে মেমরি ব্যবহার করা (এবং ধরে রাখা) থাকে তবে হ্যাঁ, আপনি ব্যবহার করতে পারেন এবং করা উচিতandroid:largeHeap="true" । তবে আপনি যদি এটি ব্যবহার করেন তবে অন্য অ্যাপ্লিকেশনগুলি পূর্বগ্রাউন্ডে থাকা অবস্থায় আপনার অ্যাপ্লিকেশনটিকে মেমরি থেকে সরিয়ে দেওয়ার জন্য প্রস্তুত থাকতে হবে।

"প্রস্তুত থাকুন" এর অর্থ হ'ল আপনার সেই সম্ভাবনার জন্য নকশা করা উচিত, যাতে আপনার onStop()এবংonResume() হ'ল পদ্ধতিগুলি যথাসম্ভব দক্ষতার সাথে রচিত হয়, যখন নিশ্চিত হয়ে যায় যে সমস্ত প্রাসঙ্গিক রাষ্ট্রটি এমনভাবে সংরক্ষণ করা এবং পুনরুদ্ধার করা হয় যা ব্যবহারকারীর কাছে একটি বিরামবিহীন উপস্থিতি উপস্থাপন করে।

তিনটি পদ্ধতি এই প্যারামিটারটি সঙ্গে সম্পর্কযুক্ত আছেন: maxMemory(), getMemoryClass(), এবংgetLargeMemoryClass()

বেশিরভাগ ডিভাইসগুলির জন্য, এর maxMemory()অনুরূপ মান উপস্থাপন করবেgetMemoryClass() ডিফল্টরূপে করে, যদিও পরবর্তীটি মেগাবাইটে প্রকাশ করা হয়, তবে পূর্ববর্তীটি বাইটে প্রকাশ করা হয়।

আপনি যখন largeHeapপ্যারামিটারটি ব্যবহার করেন , তখন maxMemory()ডিভাইস-নির্দিষ্ট উচ্চ স্তরে বাড়ানো getMemoryClass()হবে , যখন একই থাকবে।

getMemoryClass()আপনার গাদা আকারকে সীমাবদ্ধ করে না, তবে আপনি যদি আপনার অ্যাপটি যে ডিভাইসটি চালাচ্ছেন তার সীমাবদ্ধতার মধ্যে যদি আপনি আপনার অ্যাপটি স্বাচ্ছন্দ্য এবং তুলনামূলকভাবে কাজ করতে চান তবে আপনাকে যে পরিমাণ হিপ ব্যবহার করা উচিত তা তা আপনাকে জানায় ।

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

আপনার অ্যাপ্লিকেশনটি আবিষ্কার করে largeHeapপ্যারামিটারটি ব্যবহার করে কোনও নির্দিষ্ট ডিভাইসে ঠিক কতটা মেমোরি উপলব্ধ করা হবে তা পদ্ধতিটি প্রয়োগ করে আবিষ্কার করতে পারে getLargeMemoryClass()। প্রত্যাশিত মানটি মেগাবাইটে।

এই আগের পোস্টটিতে largeHeapপ্যারামিটারের আলোচনার পাশাপাশি কয়েকটি নির্দিষ্ট অ্যান্ড্রয়েড ডিভাইসে কী পরিমাণ গাদা তার ব্যবহার এবং ব্যবহার ছাড়াই উপলব্ধ করা হয়েছে তার কয়েকটি উদাহরণ রয়েছে:

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

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


1
"সমস্ত সতর্কতা বর্জন করুন এবং আপনি খেতে পারেন বুফেতে তার পথটি সরিয়ে দিন" 😂
জোশুয়া পিন্টার

4

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

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

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