studio sirve que programar para instalar descargar aplicacion java android

programar - para que sirve java en android



Tamaño del puntero: ¿Qué tan grande es una referencia de objeto? (2)

La pregunta termina después de la primera línea horizontal, el resto es información adicional.

La pregunta es simple: ¿cuál es el tamaño que consume una referencia en Android VM de Java?

Con eso quiero decir:

Si tenemos

String str = "Watever";

Necesito lo que toma str , no "Watever" . - "Watever" es lo que está guardado en la ubicación a la que apunta el puntero (o la referencia) que está sosteniendo str .

También,

Si tenemos

String str = null;

¿Cuánta memoria consume? ¿Es lo mismo que el otro str ?

Ahora, si tenemos:

Object obj[] = new object[2];

¿Cuánto consume obj y cuánto consumen obj[1] y obj[2] ?

El motivo de la búsqueda es el siguiente: (en caso de que alguien pueda recomendar algo).

Estoy trabajando en una aplicación que ofrece muchas imágenes descargadas de Internet. Comencé a almacenar esas fotos en un "banco" (que consistía en una lista de fotos).

Cuando mostraba esas imágenes en una galería, solía buscar la imagen en la lista (LENTA) y luego, si esa imagen no estaba allí, solía mostrar una imagen de descarga temporal hasta que se descargó la imagen.

Desde que sucedió en el subproceso de la interfaz de usuario, la aplicación se volvió muy lenta, así que pensé en implementar una tabla hash en el banco en lugar de la lista que tenía.

Como expliqué antes, esta búsqueda se realiza en el subproceso de la interfaz de usuario (y no puedo cambiar eso). Debido a eso, las colisiones pueden convertirse en un problema si comienzan a ralentizar el hilo.

He leído que "Para equilibrar la eficiencia de tiempo y espacio, la tabla hash debería estar llena hasta la mitad", pero eso hace que las colisiones ocurran la mitad del tiempo (no es práctico para el hilo de interfaz de usuario). Eso me hace pensar en tener una tabla hash muy larga (en comparación con la cantidad de imágenes guardadas) y usar más RAM (tener menos VMHeap libre).

Antes de determinar el tamaño de la tabla hash, quería saber cuánta memoria consumiría para no exagerar.

Sé que el tamaño de la tabla hash puede ser muy pequeño en comparación con la memoria que pueden consumir las imágenes, pero quería asegurarme de que no estaba consumiendo más memoria que la necesaria.

Antes de hacer esta pregunta busqué, entre otros lugares, en

¿Qué tan grande es una referencia de objeto en Java y precisamente qué información contiene?

tamaño del tipo de referencia en java

Tutorial Hashing

(Sí, sé que dos de los lugares se contradicen entre sí, eso es parte de la razón de la pregunta).

Si, por cualquier motivo, no entiende algo o desea más información, deje un comentario, le responderé tan pronto como pueda.

Que usted Verry mucho.


Las referencias son casi gratis. Más aún en comparación con las imágenes.

Tener algunas colisiones en un mapa no es un problema real. Las colisiones se pueden resolver mucho más rápido que una búsqueda lineal a través de una lista de elementos. Dicho esto, una búsqueda binaria a través de una lista ordenada de elementos sería una buena manera de reducir el uso de la memoria (en comparación con un mapa).

Puedo dar fe de la efectividad de tener tamaños iniciales más pequeños para Mapas. Recientemente escribí un programa que hace una estructura Trie de 170000 palabras en inglés. Cuando establecí el tamaño inicial en 26, me quedaba sin memoria cuando llegué a las palabras que comienzan con R. Al cortarlo a 5, pude crear los mapas sin problemas de memoria y puedo buscar en el árbol (con muchos colisiones) en realidad no hay tiempo.

[Editar] Si una referencia es de 32 bits (4 bytes) y su imagen promedio es de alrededor de 2 megabytes, podría colocar 500000 referencias en el mismo espacio que tomaría una sola imagen. No tienes que preocuparte por las referencias.


Una referencia de objeto o matriz ocupa una palabra de 32 bits (4 bytes) en una JVM de 32 bits o Davlik VM. Un null ocupa el mismo espacio que una referencia. (Tiene que hacerlo, porque un nulo tiene que caber en una ranura de tipo de referencia; es decir, campo de instancia, variable local, etc.)

Por otro lado, un objeto ocupa un mínimo de 2 palabras de 32 bits (8 bytes) y una matriz ocupa un mínimo de 3 palabras de 32 bits (12 bytes). El tamaño real depende del número y los tipos de campos para un objeto, y del número y tipo de elementos para una matriz.

Para una JVM de 64 bits, el tamaño de una referencia es de 64 bits, a menos que haya configurado la JVM para usar punteros comprimidos:

-XX: + UseCompressedOops Habilita el uso de punteros comprimidos (referencias a objetos representados como compensaciones de 32 bits en lugar de punteros de 64 bits) para un rendimiento optimizado de 64 bits con tamaños de almacenamiento Java inferiores a 32 gb.

Este es el nudo de tu pregunta, creo.

Antes de determinar el tamaño de la tabla hash, quería saber cuánta memoria consumiría para no exagerar.

Si asigna un HashMap o Hashtable con un tamaño inicial grande, la matriz de hash ocupará la mayor parte del espacio. Este es un conjunto de referencias, por lo que el tamaño será de 3 + initialSize palabras de tamaño 3 + initialSize 32 bits. Es poco probable que esto sea significativo ... a menos que obtenga su estimación de tamaño drásticamente errónea.

Sin embargo, creo que probablemente te preocupes innecesariamente por el rendimiento. Si está almacenando objetos en un HashMap o Hashtable asignado de forma predeterminada, la clase cambiará automáticamente el tamaño de la tabla hash a medida que crece. Por lo tanto, siempre que sus objetos tengan una función hash decente (no demasiado lenta, no hashhing todo a un pequeño número de valores), la tabla hash no debe ser un problema directo de rendimiento de la CPU.