Come aumentare le dimensioni dell'heap di un'applicazione Android?


125

Sto scrivendo un'applicazione Android che utilizza diversi modelli 3D. Un tale modello con trame può occupare molta memoria. Ho scoperto che il produttore imposta un limite alla dimensione dell'heap che un'applicazione può utilizzare. Ad esempio il mio tablet Samsung Galaxy Tab 8.9 P7310 può occupare 64 MB di memoria.

C'è un modo per aumentare questa dimensione di memoria che un'applicazione può usare?

Risposte:


210

Puoi usare android: largeHeap = "true" per richiedere una dimensione heap più grande, ma questo non funzionerà su nessun dispositivo Honeycomb pre. Sui dispositivi precedenti alla 2.3, puoi usare la classe VMRuntime, ma questo non funzionerà su Gingerbread e versioni successive.

L'unico modo per avere un limite il più ampio possibile è eseguire attività ad alta intensità di memoria tramite NDK, poiché NDK non impone limiti di memoria come l'SDK.

In alternativa, è possibile caricare solo la parte del modello attualmente visualizzata e caricare il resto quando necessario, rimuovendo le parti inutilizzate dalla memoria. Tuttavia, questo potrebbe non essere possibile, a seconda della tua app.


NDK sembra interessante. Potrei usarlo in combinazione con il mio codice già scritto con SDK?
cooxie,

3
Dipende completamente da quale codice hai. Non sono un esperto dell'NDK e conosco solo le basi. Ti consiglierei di porre questa domanda insieme a una descrizione del tuo codice sul gruppo Google android-ndk o di pubblicare una nuova domanda su SO specifica a questo con il tag android-ndk.
Raghav Sood,

Mi chiedo se non possiamo "semplicemente" usare Unity3D come una risposta più specifica alla domanda ("usa diversi modelli 3D") ... Non siamo riusciti a trovare rapidamente prove chiare sul fatto che l'unità utilizzi NDK.
Cregox,

3
largeHeap=trueFTW
Luis Artola,

2
gli sviluppatori di Android API sono davvero divertenti, sono come se volessi più Heap? Ok richiedilo, è solo per chi ne ha bisogno ... nel frattempo ogni sviluppatore lo aggiunge come prima cosa da aggiungere quando l'app arriva in produzione :)
AndroidLover,

110

C'è un modo per aumentare questa dimensione di memoria che un'applicazione può usare?

Le applicazioni in esecuzione su API livello 11+ possono avere android:largeHeap="true"sulla <application>elemento nel manifesto per richiedere una dimensione heap più grande del normale, e getLargeMemoryClass()su ActivityManagervi dirà quanto è grande quel mucchio è. Però:

  1. Funziona solo su API Level 11+ (ovvero Honeycomb e oltre)

  2. Non vi è alcuna garanzia di quanto sarà grande l'heap di grandi dimensioni

  3. L'utente percepirà la tua richiesta di heap di grandi dimensioni, poiché costringerà le loro altre app a uscire dalla RAM e terminerà i processi di altre app per liberare la RAM di sistema per l'utilizzo da parte del tuo heap di grandi dimensioni

  4. A causa del n. 3 e del fatto che mi aspetto che android:largeHeapvenga abusato, il supporto per questo potrebbe essere abbandonato in futuro o l'utente potrebbe essere avvisato di ciò al momento dell'installazione (ad esempio, sarà necessario richiedere un'autorizzazione speciale per esso )

  5. Attualmente, questa funzione è leggermente documentata


@CommonsWare se non è disponibile un largeHeap, come posso rimuovere oggetti precedentemente caricati (come le immagini)?
Jeongbebs,

@MiguelRivera: per le immagini, idealmente ricicli la loro memoria (vedi inBitmapsu BitmapOptions). Oltre a ciò, rimuovi tutti i riferimenti a loro e alla fine verranno raccolti nella spazzatura.
CommonsWare

e quale decisione suggerisci?
Gennadiy Ryabkin,

@zest: non so a cosa ti riferisci, scusa.
Commons War

2
@Eftekhari: non direttamente, per la tua app. Avere più roba può farti passare più tempo della CPU a passare quella roba, ma i dettagli dipenderebbero da cosa stai facendo con la memoria e non sono direttamente legati alla richiesta android:largeHeap. Tuttavia, richiedere un grande heap può danneggiare l'esperienza dell'utente nel suo complesso, forzando la chiusura di altri processi applicativi prima di quanto sarebbe stato necessario altrimenti.
Commons War

22

non è possibile aumentare dinamicamente le dimensioni dell'heap.

puoi richiedere di usarne di più usando android:largeHeap="true"manifest.

inoltre, è possibile utilizzare native memory (NDK & JNI), in modo da aggirare effettivamente la limitazione della dimensione dell'heap.

ecco alcuni post che ho scritto al riguardo:

ed ecco una libreria che ho creato per questo:


@ per app il limite di heap a livello java e nativo è diverso? cioè esempio su s5 devcie 128mb limite heap java e nativo può richiedere un altro128 mb?
NitZRobotKoder

Le dimensioni dell'heap sono costanti per ogni app (le dimensioni dipendono dall'hardware e dalla ROM) e dovrebbero essere le stesse per tutti. La memoria nativa è quella reale del dispositivo, ma ovviamente è anche limitata, poiché una parte di essa viene utilizzata dal sistema operativo.
sviluppatore Android il

intendevo dire se la mia app sta usando dire nativo .so + java android Platform + java POJO logic + JavaScript. Android ha dimensioni di heap diverse per ogni livello?
NitZRobotKoder


@NitZRobotKoder No. La dimensione dell'heap è per il mondo Java / Kotlin, dove è possibile ottenere l'eccezione OOM se si utilizza troppo. Per il resto, è la memoria nativa.
sviluppatore Android il

6

Usa il secondo processo. Dichiarare AndroidManifestnuovo Servicecon

android:process=":second"

Scambio tra il primo e il secondo processo BroadcastReceiver


5

Questo può essere fatto in due modi secondo il tuo sistema operativo Android.

  1. È possibile utilizzare android:largeHeap="true"nel tag dell'applicazione di manifest Android per richiedere una dimensione heap maggiore, ma non funzionerà su alcun dispositivo pre Honeycomb.
  2. Sui dispositivi precedenti alla 2.3, puoi usare la classe VMRuntime , ma questo non funzionerà su Gingerbread e sopra Vedi sotto come farlo.
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);

Prima di impostare HeapSize, assicurarsi di aver inserito la dimensione appropriata che non influirà su altre applicazioni o funzionalità del sistema operativo. Prima delle impostazioni, controlla solo le dimensioni della tua app e quindi imposta le dimensioni solo per adempiere al tuo lavoro. Non utilizzare troppa memoria altrimenti potrebbero influire altre app.

Riferimento: http://dwij.co.in/increase-heap-size-of-android-application


4
Quindi, apparentemente, <2.3 ha un modo e> 2.3 ha un modo, ma 2.3 è fregato!
Michael,

3

Da quello che ricordo potresti usare la VMRuntimeclasse nelle prime versioni di Android ma ora non puoi più.

Non credo che permettere allo sviluppatore di scegliere la dimensione dell'heap in un ambiente mobile possa essere considerato così sicuro. Penso che sia più facile trovare un modo per modificare le dimensioni dell'heap in un dispositivo specifico (non sul lato della programmazione) che provando a modificarlo dall'applicazione stessa.


0

L'aumento di Java Heap comporta ingiustamente risorse mobili in deficit. A volte è sufficiente attendere il Garbage Collector e quindi riprendere le operazioni dopo aver ridotto lo spazio dell'heap. Utilizzare quindi questo metodo statico .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.