xmx xmn see maxpermsize increase how check calculate java memory jvm initialization

xmn - xmx java



Dónde está "nulo" en la memoria (5)

No ... tendrás una referencia nula (0x00) en la variable del objeto.

En java, no se puede indicar el tamaño de una matriz en su declaración

int[5] scores; //bad

Me dijeron que esto se debe a que la JVM no asigna espacio en la memoria hasta que se inicializa un objeto. Si tiene una variable de matriz de instancia (inicializada automáticamente con un valor predeterminado de nulo), ¿indica esa variable un lugar en el montón que indique nulo?


No, porque en la JVM no hay necesidad de eso. Si está en un idioma nativo (C y C ++, por ejemplo), NULL es un puntero con valor cero y apunta a la dirección base de la memoria. Obviamente, esa no es una dirección válida, pero "puede" eliminarla de todos modos, especialmente en un sistema sin memoria protegida, como el antiguo MS-DOS o pequeños para procesadores integrados. No es que sea una dirección válida, generalmente esa ubicación contiene vectores de interrupción y no debe tocarlos. Y, por supuesto, en cualquier sistema operativo moderno que genere una falla de protección.

Pero en la JVM una referencia a un objeto es más como un identificador (es decir, un índice en una tabla) y nulo es un valor ''imposible'' (un índice que está fuera del dominio de la tabla), por lo que no puede ser desreferenciado y no ocupa espacio en tal tabla.


Una referencia nula es literalmente un valor cero. El sistema operativo impide que cualquier programa acceda a la dirección cero en la memoria, por lo que la JVM comprobará proactivamente y se asegurará de que un valor de referencia no sea cero antes de permitirle acceder a él. Esto permite que la JVM le proporcione una agradable NullPointerException en lugar de un bloqueo "El programa ha realizado una operación ilegal".

Entonces, podría decir que la variable "apunta a" una ubicación de montón no válida. O simplemente podría decir que la variable no "apunta a" nada. En ese punto, solo se trata de semántica.


Yo diría que "puntajes int [5]; // malo" no se debe a la asignación de memoria. Tenga en cuenta que cuando declara algo, realmente está declarando Type ReferenceName = new Type () normalmente.

Observe los dos ejemplos int [] scores = new int [5]; JLabel label = new JLabel ();

Los tipos (en el lado izquierdo) son int [] y JLabel, que no tienen nada que ver con la asignación de memoria (excepto por un puntero), mientras que las nuevas instancias (en el lado derecho, que requieren asignación de memoria) son int [5] , requiriendo espacio para 5 ints, y JLabel (), que no requiere argumentos para llamar al constructor, pero la memoria es suficiente para un JLabel.


Creo que esta publicación responderá a tu pregunta - Java - ¿La variable nula requiere espacio en la memoria?

En Java, null es solo un valor que puede tener una referencia (que básicamente es un puntero restringido). Significa que la referencia no hace referencia a nada. En este caso, aún consume el espacio para la referencia. Esto es 4 bytes en sistemas de 32 bits u 8 bytes en sistemas de 64 bits. Sin embargo, no está consumiendo ningún espacio para la clase a la que apunta la referencia hasta que realmente asigne una instancia de esa clase para apuntar la referencia a.

Editar: En cuanto a la Cadena, una Cadena en Java toma 16 bits (2 bytes) para cada carácter, más una pequeña cantidad de gastos generales de contabilidad, que probablemente no esté documentada y sea específica de la implementación.

(recuerda invitar a la respuesta en el enlace si te ayuda)