Java y tamaño de referencia exacto para objetos, matrices y tipos primitivos

Me gustaría saber exactamente el espacio real asignado en la memoria para un objeto.

Intento explicarlo con un ejemplo: utilizando una JVM de 64 bits, el tamaño del puntero debe ser de 8 bytes, por lo que:

  • Object singletest = new Object(); tomará 8 bytes para hacer referencia al objeto más el tamaño del objeto
  • Object arraytest = new Object[10]; tomará 8 bytes para hacer referencia a la posición donde se almacena la matriz más 8 * 10 bytes para almacenar la matriz más el tamaño de cada Objeto
  • int singleint = new int; tomará solo 2 bytes, porque int es un tipo primitivo
  • int[] arrayint = new int[10]; tomará 8 bytes para hacer referencia a la posición y 10 * 2 bytes para los elementos

Además, esta es la razón por la que Java permite escribir código como este:

 int[][] doublearray = new int[2][]; int[0][] = new int[5]; int[1][] = new int[10]; 

Lo que realmente sucede es que una matriz producirá una referencia (también conocida como puntero) como un objeto, por lo que realmente no importa el tamaño de la segunda dimensión en el momento de la statement (y las dimensiones pueden ser diferentes, no hay un vínculo entre ellas). Luego, el espacio ocupado será: una referencia a doublearray (8 bytes), la primera dimensión es simplemente una referencia a la segunda, por lo que otros 8 bytes * 2 (tamaño de la primera dimensión), y finalmente 2 bytes * 5 más 2 bytes * 10 .

Así que, finalmente, si tienes una clase real como esta:

 class Test { int a, b; int getA() {return A}; void setA(int a) {this.a = a;} int getB() {return B}; void setB(int b) {this.b = b;} } 

cuando invoco a un nuevo para crear una instancia, se utilizará un puntero (o nombre de referencia, porque es Java) de 8 bytes más 2 + 2bytes para almacenar los números enteros en la clase.

Las preguntas son: ¿estoy en lo cierto o escribí tonterías totales? Además, cuando no hago una instancia de un objeto sino que simplemente lo declaro, ¿se asignarán 8 bytes para uso adicional o no? ¿Y qué pasa si asigno un valor nulo?

Mientras tanto, para el tipo primitivo, estoy bastante seguro de que solo declararlo asignará el espacio solicitado (si declaro un “int i”, inmediatamente puedo llamar a i ++ porque no se usa ninguna referencia, solo una parte de la memoria está configurada en “0” ).

Busqué en Internet sin una respuesta inteligente … Sé que escribí muchas preguntas, ¡pero cualquier ayuda será apreciada! (y tal vez no soy el único interesado)