Piszę aplikację na Androida, która wykorzystuje kilka modeli 3D. Taki model z teksturami może zajmować dużo pamięci. Dowiedziałem się, że producent ustala limit rozmiaru sterty, z którego może korzystać aplikacja. Na przykład mój tablet Samsung Galaxy Tab 8.9 P7310 może zająć 64 MB pamięci.
Czy istnieje sposób na zwiększenie tego rozmiaru pamięci, z którego może korzystać aplikacja?
largeHeap=true
FTWAplikacje działające na API Level 11+ może mieć
android:largeHeap="true"
na<application>
element manifest zwrócić większą niż normalna wielkość sterty, agetLargeMemoryClass()
onActivityManager
powie Ci, jak duża jest to kupa. Jednak:Działa to tylko na poziomie API 11+ (tj. Plaster miodu i nie tylko)
Nie ma gwarancji, jak duża będzie duża sterta
Użytkownik zauważy twoje żądanie dużej sterty, ponieważ
wymusi to na innych aplikacjach z pamięci RAM, którezakończy procesy innych aplikacji, aby zwolnić systemową pamięć RAM do wykorzystania przez dużą stertęZe względu na # 3 i fakt, że spodziewam się, że
android:largeHeap
będzie nadużywany, wsparcie dla tego może zostać w przyszłości porzucone lub użytkownik może zostać o tym ostrzeżony w czasie instalacji (np. Będziesz musiał poprosić o specjalne pozwolenie na to )Obecnie ta funkcja jest słabo udokumentowana
źródło
inBitmap
dalejBitmapOptions
). Poza tym usuń wszystkie odniesienia do nich, a ostatecznie zostaną zebrane jako śmieci.android:largeHeap
. Jednak żądanie dużej sterty może ogólnie zaszkodzić użytkownikowi, zmuszając inne procesy aplikacji do zakończenia wcześniejszego niż byłoby to potrzebne w innym przypadku.nie można dynamicznie zwiększać rozmiaru sterty.
możesz poprosić o użycie więcej, używając
android:largeHeap="true"
w manifeście.możesz również użyć
native memory (NDK & JNI)
, więc faktycznie pomijasz ograniczenie rozmiaru sterty.oto kilka postów, które napisałem na ten temat:
Jak buforować mapy bitowe w pamięci natywnej
Operacje na bitmapach JNI, pomagające uniknąć OOM podczas używania dużych obrazów
a oto biblioteka, którą dla niego stworzyłem:
źródło
Użyj drugiego procesu. Zadeklaruj jako
AndroidManifest
nowyService
zWymiana między pierwszym a drugim procesem zakończona
BroadcastReceiver
źródło
Można to zrobić na dwa sposoby w zależności od systemu operacyjnego Android.
android:largeHeap="true"
w tagu aplikacji manifestu systemu Android, aby zażądać większego rozmiaru sterty, ale nie będzie to działać na żadnych urządzeniach z wcześniejszą wersją plastra miodu.Przed ustawieniem HeapSize upewnij się, że wprowadziłeś odpowiedni rozmiar, który nie wpłynie na inne funkcje aplikacji lub systemu operacyjnego. Przed ustawieniami sprawdź, jaki rozmiar zajmuje Twoja aplikacja, a następnie ustaw rozmiar, aby spełnić swoje zadanie. Nie używaj tak dużo pamięci, w przeciwnym razie inne aplikacje mogą mieć wpływ.
Źródła: http://dwij.co.in/increase-heap-size-of-android-application
źródło
Z tego, co pamiętam, mogłeś używać
VMRuntime
klasy we wczesnych wersjach Androida, ale teraz już nie możesz.Nie sądzę jednak, aby pozwolić deweloperowi wybrać rozmiar sterty w środowisku mobilnym, można uznać za tak bezpieczne. Myślę, że łatwiej jest znaleźć sposób na zmodyfikowanie rozmiaru sterty w określonym urządzeniu (nie po stronie programowania), próbując zmodyfikować go z poziomu samej aplikacji.
źródło
Zwiększanie ilości Java Heap niesprawiedliwie zjada niedobór zasobów mobilnych. Czasami wystarczy poczekać na garbage collector, a następnie wznowić działanie po zmniejszeniu miejsca na sterty. Następnie użyj tej statycznej metody .
źródło