Estoy escribiendo una aplicación de Android que usa varios modelos 3D. Tal modelo con texturas puede ocupar mucha memoria. Descubrí que el fabricante establece un límite en el tamaño de almacenamiento dinámico que una aplicación puede usar. Por ejemplo, mi tableta Samsung Galaxy Tab 8.9 P7310 puede ocupar 64 MB de memoria.
¿Hay alguna manera de aumentar este tamaño de memoria que una aplicación puede usar?
largeHeap=true
FTWLas aplicaciones que se ejecutan en API Nivel 11+ pueden tener
android:largeHeap="true"
en el<application>
elemento en el manifiesto para solicitar un tamaño de almacenamiento dinámico mayor que el normal, y engetLargeMemoryClass()
adelanteActivityManager
le indicarán qué tan grande es ese almacenamiento dinámico. Sin embargo:Esto solo funciona en API Level 11+ (es decir, Honeycomb y más allá)
No hay garantía de cuán grande será el montón grande
El usuario percibirá su solicitud de gran cantidad, ya que
obligará a sus otras aplicaciones a salir de la RAM yfinalizará los procesos de otras aplicaciones para liberar la RAM del sistema para que la use su gran cantidadDebido al n. ° 3, y el hecho de que espero que
android:largeHeap
se abuse de él, el soporte para esto puede abandonarse en el futuro, o el usuario puede ser advertido sobre esto en el momento de la instalación (por ejemplo, deberá solicitar un permiso especial para ello )Actualmente, esta característica está ligeramente documentada
fuente
inBitmap
adelanteBitmapOptions
). Más allá de eso, elimine todas las referencias a ellos, y eventualmente se recolectarán basura.android:largeHeap
. Sin embargo, solicitar un gran montón puede dañar la experiencia del usuario en general, al obligar a otros procesos de aplicación a finalizar antes de lo que se hubiera necesitado de lo contrario.no puede aumentar el tamaño del montón dinámicamente.
puedes solicitar usar más usando
android:largeHeap="true"
el manifiesto.también, puede usar
native memory (NDK & JNI)
, por lo que realmente omite la limitación del tamaño de almacenamiento dinámico.Aquí hay algunas publicaciones que he hecho al respecto:
Cómo almacenar en caché mapas de bits en la memoria nativa
Operaciones de mapa de bits JNI, para ayudar a evitar OOM cuando se usan imágenes grandes
y aquí hay una biblioteca que hice para ello:
fuente
Use el segundo proceso. Declarar en
AndroidManifest
nuevoService
conIntercambio entre primer y segundo proceso sobre
BroadcastReceiver
fuente
Esto se puede hacer de dos maneras según su sistema operativo Android.
android:largeHeap="true"
etiqueta de aplicación del manifiesto de Android para solicitar un tamaño de almacenamiento dinámico mayor, pero esto no funcionará en ningún dispositivo anterior a Honeycomb.Antes de configurar HeapSize, asegúrese de haber ingresado el tamaño apropiado que no afectará la funcionalidad de otras aplicaciones o sistemas operativos. Antes de la configuración, solo verifique cuánto tamaño toma su aplicación y luego configure el tamaño solo para cumplir con su trabajo. No use tanta memoria, de lo contrario, otras aplicaciones podrían afectar.
Referencia: http://dwij.co.in/increase-heap-size-of-android-application
fuente
Por lo que recuerdo, podría usar la
VMRuntime
clase en las primeras versiones de Android, pero ahora ya no puede.Sin embargo, no creo que permitir que el desarrollador elija el tamaño de almacenamiento dinámico en un entorno móvil pueda considerarse tan seguro. Creo que es más fácil que pueda encontrar una manera de modificar el tamaño del almacenamiento dinámico en un dispositivo específico (no en el lado de la programación) que al intentar modificarlo desde la propia aplicación.
fuente
El aumento de Java Heap consume injustamente los recursos móviles con déficit. A veces es suficiente esperar al recolector de basura y luego reanudar sus operaciones después de reducir el espacio de almacenamiento dinámico. Use este método estático entonces.
fuente