¿Cuántos bytes ocupa una matriz en Java? Suponga que es una máquina de 64 bits y también asuma que hay N elementos en una matriz, por lo que todos estos elementos ocuparían 2 * N, 4 * N u 8 * N bytes para diferentes tipos de matriz.
Y una conferencia en Coursera dice que ocuparía 2 * N + 24, 4 * N + 24 u 8 * N + 24 bytes para una matriz de elementos N y los 24 bytes se denominan sobrecarga, pero no explicaron por qué la sobrecarga es necesario.
También los objetos tienen gastos generales, que son 16 bytes.
¿Qué son exactamente estos gastos generales? ¿De qué están compuestos estos 24/16 bytes?
Además, ¿estos gastos generales solo existen en Java? ¿Qué tal C, C ++ y Python?
Respuestas:
Cada objeto Java tiene un encabezado que contiene información importante para la JVM. Lo más importante es una referencia a la clase del objeto (una palabra de máquina), y el recolector de basura utiliza algunos indicadores y para administrar la sincronización (ya que cada objeto se puede sincronizar) que toma otra palabra de máquina (usar palabras parciales ser malo para el rendimiento). Eso son 2 palabras, que son 8 bytes en sistemas de 32 bits y 16 bytes en 64 bits. Las matrices además necesitan un campo int para la longitud de la matriz, que son otros 4 bytes, posiblemente 8 en sistemas de 64 bits.
En cuanto a otros idiomas:
C no tiene objetos, por lo que, por supuesto, no tiene encabezados de objeto, pero puede tener un encabezado en cada pieza de memoria asignada por separado.
En C ++, no tiene recolección de basura y no puede usar objetos arbitrarios para la sincronización, pero si tiene clases con métodos anulados, cada objeto tiene un puntero a su vtable, al igual que la referencia del objeto Java a su clase. Si utiliza punteros inteligentes que recogen basura, necesitan datos de limpieza.
No sé acerca de Python, pero estoy bastante seguro de que también necesita una referencia a la clase e información de limpieza para el recolector de basura.
fuente
std::pair<int, float>
es una clase simple que no necesita una vtable en absoluto. Como resultado, puede muy bien caber en 8 bytes. Además, los punteros inteligentes en realidad no necesitan agregar limpieza. Un claro contraejemplo esstd::unique_ptr<T>
, que generalmente es tan grande como el rawT*
(unique_ptr, por supuesto, no hace GC).malloc
bloque de memoria asignado necesita un encabezado quefree
luego utiliza.