Estou escrevendo um aplicativo Android que usa vários modelos 3D. Esse modelo com texturas pode ocupar muita memória. Descobri que o fabricante define um limite para o tamanho da pilha que um aplicativo pode usar. Por exemplo, meu tablet Samsung Galaxy Tab 8.9 P7310 pode ocupar 64 MB de memória.
Existe uma maneira de aumentar esse tamanho de memória que um aplicativo pode usar?
largeHeap=true
FTWOs aplicativos em execução na API Nível 11+ podem ter
android:largeHeap="true"
no<application>
elemento no manifesto para solicitar um tamanho de heap maior que o normal, egetLargeMemoryClass()
onActivityManager
informará o tamanho desse heap. Contudo:Isso funciona apenas no nível API 11+ (ou seja, Honeycomb e além)
Não há garantia de quão grande será a pilha grande
O usuário perceberá sua solicitação de grande heap, porque
forçará os outros aplicativos a sair da RAM eencerrará os processos de outros aplicativos para liberar a RAM do sistema para uso em sua grande heapPor causa do número 3, e pelo fato de eu esperar que
android:largeHeap
isso seja abusado, o suporte para isso pode ser abandonado no futuro ou o usuário pode ser avisado sobre isso no momento da instalação (por exemplo, você precisará solicitar uma permissão especial para isso) )Atualmente, esse recurso está ligeiramente documentado
fonte
inBitmap
a seguirBitmapOptions
). Além disso, remova todas as referências a eles e, eventualmente, eles serão coletados como lixo.android:largeHeap
. No entanto, solicitar uma pilha grande pode prejudicar a experiência do usuário em geral, forçando outros processos de aplicativos a serem encerrados mais cedo do que seria necessário.você não pode aumentar o tamanho da pilha dinamicamente.
você pode solicitar o uso de mais usando
android:largeHeap="true"
o manifesto.Além disso, você pode usar
native memory (NDK & JNI)
, para realmente ignorar a limitação do tamanho da pilha.Aqui estão alguns posts que eu fiz sobre isso:
Como armazenar em cache bitmaps na memória nativa
Operações de bitmap JNI, para ajudar a evitar OOM ao usar imagens grandes
e aqui está uma biblioteca que eu fiz para isso:
fonte
Use o segundo processo. Declarar
AndroidManifest
novoService
comIntercâmbio entre o primeiro e o segundo processo
BroadcastReceiver
fonte
Isso pode ser feito de duas maneiras, de acordo com o sistema operacional Android.
android:largeHeap="true"
tag de aplicativo do manifesto do Android para solicitar um tamanho de heap maior, mas isso não funcionará em nenhum dispositivo pré-Honeycomb.Antes de configurar o HeapSize, verifique se você inseriu o tamanho apropriado que não afetará outro aplicativo ou funcionalidade do sistema operacional. Antes das configurações, verifique o tamanho do aplicativo e defina o tamanho apenas para realizar seu trabalho. Não use muita memória, caso contrário outros aplicativos podem afetar.
Referência: http://dwij.co.in/increase-heap-size-of-android-application
fonte
Pelo que me lembro, você poderia usar a
VMRuntime
classe nas primeiras versões do Android, mas agora não pode mais.Não acho que deixar o desenvolvedor escolher o tamanho da pilha em um ambiente móvel possa ser considerado tão seguro. Eu acho que é mais fácil encontrar uma maneira de modificar o tamanho da pilha em um dispositivo específico (não no lado da programação), tentando modificá-lo a partir do próprio aplicativo.
fonte
Aumentar o Java Heap injustamente consome recursos móveis deficitários. Às vezes, basta aguardar o coletor de lixo e, em seguida, retomar suas operações após a redução do espaço de heap. Use este método estático então.
fonte