2012-06-30 21 views
111

मैं एक एंड्रॉइड एप्लिकेशन लिख रहा हूं जो कई 3 डी मॉडल का उपयोग करता है। बनावट के साथ ऐसा मॉडल बहुत मेमोरी ले सकता है। मैंने पाया कि निर्माता ढेर आकार पर एक सीमा निर्धारित करता है जो एक एप्लीकेशन उपयोग कर सकता है। उदाहरण के लिए मेरा टैबलेट सैमसंग गैलेक्सी टैब 8.9 पी 7310 64 एमबी मेमोरी ले सकता है।एंड्रॉइड एप्लिकेशन के ढेर आकार को कैसे बढ़ाया जाए?

क्या इस एप्लिकेशन का उपयोग करने के लिए स्मृति के इस आकार को बढ़ाने का कोई तरीका है?

उत्तर

188

आप android:largeHeap="true" उपयोग कर सकते हैं एक बड़ा ढेर आकार अनुरोध करने के लिए, लेकिन यह किसी भी पूर्व हनीकोम्ब उपकरणों पर काम नहीं करेगा। पूर्व 2.3 उपकरणों पर, आप VMRuntime कक्षा का उपयोग कर सकते हैं, लेकिन यह जिंजरब्रेड और ऊपर काम नहीं करेगा।

एनडीके के माध्यम से स्मृति गहन कार्यों को जितना संभव हो उतना बड़ा सीमा रखने का एकमात्र तरीका है, क्योंकि एनडीके एसडीके की तरह स्मृति सीमा लागू नहीं करता है।

वैकल्पिक रूप से, आप केवल उस मॉडल का हिस्सा लोड कर सकते हैं जो वर्तमान में देख रहा है, और बाकी को लोड करें, जबकि आपको स्मृति से अप्रयुक्त हिस्सों को हटाते समय लोड करें। हालांकि, यह संभव नहीं हो सकता है, आपके ऐप के आधार पर।

+0

एनडीके दिलचस्प लग रहा है। क्या मैं इसे एसडीके के साथ पहले से लिखे गए कोड के साथ संयोजन में उपयोग कर सकता हूं? – cooxie

+3

यह आपके पास कौन सा कोड है इस पर निर्भर करता है। मैं एनडीके के साथ एक विशेषज्ञ नहीं हूं, और केवल मूल बातें जानता हूं। मैं आपको एंड्रॉइड-एनएनडीके Google समूह पर अपने कोड के विवरण के साथ इस प्रश्न से पूछने की सलाह दूंगा, या एंड्रॉइड-एनएनडीके टैग के साथ एसओ पर एक नया प्रश्न पोस्ट करूंगा। –

+0

@cooxie निश्चित रूप से आप देख सकते हैं, जेएनआई दस्तावेज –

3

मुझे याद है कि आप एंड्रॉइड संस्करणों में VMRuntime कक्षा का उपयोग कर सकते हैं लेकिन अब आप अभी और नहीं कर सकते हैं।

मुझे नहीं लगता कि डेवलपर को मोबाइल वातावरण में ढेर आकार चुनने देना इतना सुरक्षित माना जा सकता है। मुझे लगता है कि यह आसान है कि आप एक विशिष्ट डिवाइस (प्रोग्रामिंग पक्ष पर नहीं) में हीप आकार को संशोधित करने का एक तरीका ढूंढ सकते हैं, जो इसे एप्लिकेशन से संशोधित करने का प्रयास कर रहा है।

102

क्या इस एप्लिकेशन का उपयोग करने के लिए स्मृति के इस आकार को बढ़ाने का कोई तरीका है?

एप्लीकेशन एपीआई स्तर पर चल रहा है 11+ एक बड़े से भी सामान्य ढेर आकार अनुरोध करने के लिए प्रकट में <application> तत्व पर android:largeHeap="true" हो सकता है, और getLargeMemoryClass()ActivityManager पर आपको बता देंगे कितना बड़ा ढेर है। हालांकि:

  1. एपीआई स्तर पर यह केवल काम करता है 11+ (यानी, हनीकोम्ब और आगे)

  2. इसकी कोई गारंटी नहीं है कि कैसे बड़े बड़े ढेर हो जाएगा

  3. उपयोगकर्ता अनुभव होगा आपके बड़े ढेर अनुरोध है, क्योंकि यह रैम से बाहर उनके अन्य एप्लिकेशन के लिए बाध्य करेगा अपने बड़े ढेर द्वारा उपयोग के लिए प्रणाली रैम को मुक्त करने के अन्य एप्लिकेशन के प्रक्रियाओं को समाप्त

  4. क्योंकि # 3 का, और तथ्य यह है कि मुझे उम्मीद है कि android:largeHeap का दुरुपयोग किया जाएगा, इसके लिए समर्थन भविष्य में छोड़ दिया जा सकता है, या उपयोगकर्ता को इंस्टॉल समय पर इसके बारे में चेतावनी दी जा सकती है (उदाहरण के लिए, आपको इसके लिए विशेष अनुमति का अनुरोध करना होगा)

  5. वर्तमान में, इस सुविधा हल्के से प्रलेखित है

+0

@CommonsWare अगर एक largeHeap होने उपलब्ध नहीं है, कैसे मैं पहले हटा सकते हैं भारित वस्तुओं (छवियों की तरह)? – Jeongbebs

+0

@MiguelRivera: छवियों के लिए, आदर्श रूप से आप उनकी याददाश्त रीसायकल करते हैं ('बिटमैप विकल्प 'पर' बिटमैप 'देखें)। इसके अलावा, उन सभी संदर्भों को हटा दें, और * आखिरकार * उन्हें कचरा इकट्ठा किया जाएगा। – CommonsWare

+0

और आप किस निर्णय का सुझाव देते हैं? – zest

19

आप ढेर आकार को गतिशील रूप से बढ़ा नहीं सकते हैं।

आप मेनिफेस्ट में android:largeHeap="true" का उपयोग कर अधिक उपयोग करने का अनुरोध कर सकते हैं।

भी, आप native memory (NDK & JNI) का उपयोग कर सकते हैं, इसलिए आप वास्तव में ढेर आकार सीमा को बाईपास करते हैं।

और यहाँ एक पुस्तकालय मैं इसे के लिए बनाया गया है::

यहाँ कुछ पदों मैं इसके बारे में बनाया है कर रहे हैं

+0

@ प्रति ऐप जावा स्तर पर ढेर सीमा है और मूल अलग है? i.e उदाहरण पर s5 devcie 128mb जावा ढेर सीमा और देशी एक और 128 एमबी ले सकते हैं? – NitZRobotKoder

+0

प्रत्येक ऐप के लिए हीप आकार स्थिर है (आकार हार्डवेयर और रोम पर निर्भर करता है) और सभी के लिए समान होना चाहिए। मूल स्मृति डिवाइस का असली एक है, लेकिन यह निश्चित रूप से भी सीमित है, क्योंकि इनमें से कुछ ओएस द्वारा उपयोग किया जाता है। –

+0

मेरा मतलब था कि मेरा ऐप देशी कहने का उपयोग कर रहा है। इसलिए + जावा एंड्रॉइड प्लेटफ़ॉर्म + जावा POJO तर्क + जावास्क्रिप्ट। क्या एंड्रॉइड के प्रत्येक स्तर पर विभिन्न ढेर आकार है? – NitZRobotKoder

3

यह आपके एंड्रॉइड ओएस के अनुसार दो तरीकों से किया जा सकता है।

  1. आप एक बड़ा ढेर आकार अनुरोध करने के लिए प्रकट एंड्रॉयड के आवेदन टैग में android:largeHeap="true" उपयोग कर सकते हैं, लेकिन यह किसी भी पूर्व हनीकोम्ब उपकरणों पर काम नहीं करेगा।
  2. पूर्व 2.3 डिवाइसों पर, आप VMRuntime क्लास का उपयोग कर सकते हैं, लेकिन यह जिंजरब्रेड पर काम नहीं करेगा और ऊपर देखें कि इसे कैसे करें।
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE); 

स्थापना HeapSize सुनिश्चित करें कि आप उचित आकार जो अन्य अनुप्रयोग या ओएस कार्यक्षमता को प्रभावित नहीं करेगा दर्ज किया है पहले। सेटिंग से पहले बस जांचें कि आपका ऐप कितना आकार लेता है और फिर अपना काम पूरा करने के लिए आकार सेट करें। इतनी मेमोरी का उपयोग न करें अन्यथा अन्य ऐप्स प्रभावित हो सकते हैं।

संदर्भ: http://dwij.co.in/increase-heap-size-of-android-application

+2

तो जाहिर है, <2.3 का एक तरीका है, और> 2.3 का एक तरीका है, लेकिन 2.3 खराब है! – Michael

5

उपयोग दूसरी प्रक्रिया। BroadcastReceiver

0

बढ़ाने से जावा ढेर गलत तरीके से घाटा मोबाइल resurces खाती अधिक

android:process=":second" 

पहली और दूसरी प्रक्रिया के बीच आदान-प्रदान के साथ AndroidManifest नई Service पर घोषित। कभी-कभी यह कचरा कलेक्टर के लिए पर्याप्त है और फिर ढेर स्थान कम होने के बाद अपने परिचालन फिर से शुरू करने के लिए पर्याप्त है। तब static method का उपयोग करें।

0

एक और वैकल्पिक विकल्प है जिसका उपयोग स्मृति सेटिंग्स को ट्वीव करने के लिए किया जाता है। आप सभी को जोड़ने करना है/बदलें gradle.properties में मौजूदा लाइन फाइल

org.gradle.jvmargs = -Xmx1024m

संबंधित मुद्दे