Como aumentar o tamanho da pilha de um aplicativo Android?

125

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?

cooxie
fonte

Respostas:

210

Você pode usar android: largeHeap = "true" para solicitar um tamanho de pilha maior, mas isso não funcionará em nenhum dispositivo Honeycomb anterior. Nos dispositivos anteriores à 2.3, você pode usar a classe VMRuntime, mas isso não funcionará no Gingerbread e acima.

A única maneira de ter um limite o maior possível é executar tarefas intensivas de memória por meio do NDK, pois o NDK não impõe limites de memória como o SDK.

Como alternativa, você só pode carregar a parte do modelo que está atualmente em exibição e carregar o restante conforme necessário, enquanto remove as partes não utilizadas da memória. No entanto, isso pode não ser possível, dependendo do seu aplicativo.

Raghav Sood
fonte
NDK parece interessante. Eu poderia usá-lo em combinação com meu código já escrito com o SDK?
cooxie
3
Isso depende completamente do código que você possui. Não sou especialista no NDK e conheço apenas o básico. Eu recomendo que você faça essa pergunta junto com uma descrição do seu código no grupo android-ndk do Google ou publique uma nova pergunta sobre SO específica a isso com a tag android-ndk.
Raghav Sood
Gostaria de saber se não podemos "simplesmente" usar o Unity3D como uma resposta mais específica à pergunta ("usa vários modelos 3D") ... Não foi possível encontrar rapidamente nenhuma evidência clara sobre se o Unity usa NDK.
Cregox # 12/15
3
largeHeap=trueFTW
Luis Artola
2
os desenvolvedores da API do Android são realmente engraçados, são como se você quisesse mais Heap? Ok solicitá-lo, é apenas para aqueles que precisam dela ... enquanto isso todo desenvolvedor está adicionando-o como primeira coisa a acrescentar quando o aplicativo trata de produção :)
AndroidLover
110

Existe uma maneira de aumentar esse tamanho de memória que um aplicativo pode usar?

Os 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, e getLargeMemoryClass()on ActivityManagerinformará o tamanho desse heap. Contudo:

  1. Isso funciona apenas no nível API 11+ (ou seja, Honeycomb e além)

  2. Não há garantia de quão grande será a pilha grande

  3. O usuário perceberá sua solicitação de grande heap, porque forçará os outros aplicativos a sair da RAM e encerrará os processos de outros aplicativos para liberar a RAM do sistema para uso em sua grande heap

  4. Por causa do número 3, e pelo fato de eu esperar que android:largeHeapisso 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) )

  5. Atualmente, esse recurso está ligeiramente documentado

CommonsWare
fonte
@CommonsWare, se não houver um largeHeap disponível, como posso remover objetos carregados anteriormente (como imagens)?
21413 Jeongbebs
@ MiguelRivera: Para imagens, idealmente você recicla a memória (veja inBitmapa seguir BitmapOptions). Além disso, remova todas as referências a eles e, eventualmente, eles serão coletados como lixo.
CommonsWare
e qual decisão você sugere?
Gennadiy Ryabkin
@ zest: Eu não sei o que você está se referindo, desculpe.
CommonsWare
2
@Eftekhari: Não diretamente, para o seu aplicativo. Ter mais coisas pode fazer com que você gaste mais tempo com a CPU, mas os detalhes dependem do que você está fazendo com a memória e não está diretamente ligado à solicitação 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.
CommonsWare
22

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:

e aqui está uma biblioteca que eu fiz para isso:

desenvolvedor android
fonte
@ por aplicativo o heap limita no nível do java e o nativo é diferente? ou seja, exemplo em s5 devcie 128mb java heap limit e nativo pode demorar outro128 mb?
NitZRobotKoder
O tamanho da pilha é constante para cada aplicativo (o tamanho depende do hardware e da ROM) e deve ser o mesmo para todos. A memória nativa é a real do dispositivo, mas é claro também limitada, pois parte dela é usada pelo sistema operacional.
desenvolvedor android
eu quis dizer se meu aplicativo está usando, digamos, nativo .so + java Android Platform + java POJO logic + JavaScript. O android tem tamanho de pilha diferente em cada nível?
NitZRobotKoder 12/12
@NitZRobotKoder Não. O tamanho do heap é para o mundo Java / Kotlin, onde você pode obter uma exceção do OOM se usar muito. Para o resto, é a memória nativa.
desenvolvedor android
6

Use o segundo processo. Declarar AndroidManifestnovo Servicecom

android:process=":second"

Intercâmbio entre o primeiro e o segundo processo BroadcastReceiver

Yura Shinkarev
fonte
5

Isso pode ser feito de duas maneiras, de acordo com o sistema operacional Android.

  1. Você pode usar a 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.
  2. Nos dispositivos anteriores à 2.3, você pode usar a classe VMRuntime , mas isso não funcionará no Gingerbread e acima. Veja abaixo como fazê-lo.
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);

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

Desenvolvedor Web em Pune
fonte
4
Então, aparentemente, <2.3 tem um caminho, e> 2.3 tem um caminho, mas 2.3 está ferrado!
Michael
3

Pelo que me lembro, você poderia usar a VMRuntimeclasse 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.

Jack
fonte
0

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.

Zon
fonte