Java - Varios objetos del mismo tipo comparten espacios de RAM?

 
Vista:

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Rakan (9 intervenciones) el 15/04/2019 21:30:16
Si tengo una clase con un método foo() y guardo 10.000 instancias de esta clase en una lista, todas estas instancias tienen su espacio para el método foo() en RAM, o todas ellas acceden a la misma zona para ahorrar memoria? Es una duda que llevo teniendo desde hace tiempo. Por ejemplo también, si hago que la clase tenga una variable final con un valor "ABCDEFGHIJKLMNOPQRSTUVWXYZ", se comparte el espacio en RAM para que no se tenga tanta información duplicada o no?


PD: con compartir espacio me refiero a si todos los objetos acceden al mismo espacio de memória con el método/variable en vez de tenerlo duplicado.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
-1
Responder
sin imagen de perfil
Val: 8
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por pedro (2 intervenciones) el 16/04/2019 00:32:05
No soy muy experto pero creo que se reserva un espacio de memoria para casa instancia
Cuando haces un new reservas espacio en memoria
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Rakan (9 intervenciones) el 16/04/2019 01:38:43
Se me hace un poco extraño... Tener 10.000 objetos con métodos que hacen muchas cosas acabará ocupando muchísimo espacio con información duplicada, por ejemplo, clases clases de javax.swing... En todo caso, espero que el sistema operativo o los controladores de la RAM sean lo suficientemente listos como para ver que se está haciendo esta barbaridad y hagan algún paso intermedio para evitar que se desperdicie una cantidad tan tremendamente alta de memoria.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Billy Joel (875 intervenciones) el 16/04/2019 04:21:57
En una ocación me tocó validar muuuuuuucha data, más de 15 millones de registros.
Creeme que 10,000 registros con las computadoras que tenemos hoy en día no es nada....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Tom (1831 intervenciones) el 16/04/2019 09:00:13
Los métodos no son inline, el código de un método de una clase solamente está una vez en la memoria (y en los .class).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Agustin (170 intervenciones) el 16/04/2019 13:54:38
En realidad si, java es una máquina de desperdiciar memoria, no por el espacio que ocupan los métodos (que es compartido), sino principalmente por la falta de value types, lo que hace que muchas estructuras que de otra forma se podrían representar usando unos pocos bytes terminen teniendo mucho overhead innecesario por el uso (interno) de punteros y boxing para poder representarlos en el terriblemente limitado e inexpresivo type system de java.

oracle está tratando de subsanar esto en futuras versiones de java (de esas que vienen prometiendo desde hace años y nunca salen a la luz), pero en mi opinión se acordaron un poquitito tarde... como 20 años digamos. Mientras en otras plataformas estas ventajas existen hace más de 15.

La pregunta real es por qué alguien almacenaría en memoria 10,000 instancias de objetos pertenecientes a la capa de presentación. Estaría bueno tener un poco más de detalle de lo que estás haciendo para entender. Pero en principio no se me ocurre ninguna razón válida. Si tu modelo de datos tiene una dependencia con clases de javax.swing, que entiendo que pertenece al framework Swing que es un framework de capa de presentación, te diría que es un indicio bastante claro de un mal diseño.

De todas formas, con las enormes liimitaciones que existen en los frameworks de java, es probable que lo que necesites hacer no se pueda resolver usando un diseño desacoplado, ya que los frameworks de java no soportan MVVM ni nada parecido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-3
Comentar

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Tom (1831 intervenciones) el 16/04/2019 14:51:17
¿ "En realidad sí" qué, imbécil ?
¿ Puedes dar datos acerca de algun lenguaje de programación que no use indirección (punteros) internamente ?
¿ Puedes explicarnos la manera de implementar un "objeto" que no pase por tener un puntero a su vtable -o algún método muy similar- asociado al mismo ?
¿ Puedes dar datos acerca de algún lenguaje orientado a objetos que no recubra a los tipos básicos para convertirlos en "objetos" ?
¿ Te parecen muchos 10.000 objetos ? Es fácil usar 50.000 o más en un mapa vectorial ... a no ser que tú conozcas ya, adelantado a tu época, el método cuántico para que un mismo objeto contenga 50000 estados distintos simultáneamente, en un solo qbit.

¿ Podrías dejar de soltar gilipolleces ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Agustin (170 intervenciones) el 16/04/2019 16:25:55
"En realidad sí" que?

En realidad si, java es una máquina de desperdiciar memoria, ya que no tiene value types, o, estrictamente hablando, la habilidad de definir value types nuevos, fuera de los "primitivos" que ya existen.

https://stackoverflow.com/a/9345212/643085

> ¿Puedes dar datos acerca de algun lenguaje de programación que no use indirección (punteros) internamente ?

C# tiene Value Types, desde su versión 2.0 en 2005, mientras que java está recién ahora intentando lograr esto.

Si no sabes lo que es un value type, lo lamento, noob. Volvé a la escuela.

¿ Puedes explicarnos la manera de implementar un "objeto" que no pase por tener un puntero a su vtable -o algún método muy similar- asociado al mismo ?

En C#, los value types no se pueden heredar, por lo tanto no necesitan V-tables. El método exacto que se invoca se determina en tiempo de compilación.

> ¿ Puedes dar datos acerca de algún lenguaje orientado a objetos que no recubra a los tipos básicos para convertirlos en "objetos" ?

En C#, un int es un int, ocupa exactamente 32 bits, y si lo metes en un List<int>, sigue ocupando 32 bits, porque C# tiene generics de verdad, al contrario de java, donde los generics no soportan los tipos "primitivos" y por lo tanto recurre constantemente al boxing. Fijate que "Integer" no es igual a "int" en java, mientras que en C# el keyword "int" representa exactamente lo mismo que usar System.Int32. Lo mismo con los demas value types.

> ¿ Te parecen muchos 10.000 objetos ?

Yo solo pregunté respecto del diseño, y no de la cantidad de objetos. Generalmente la gente que utiliza el paradigma tradicional para constuir GUIs no tiene noción de conceptos como UI Virtualization, o la noción de que los datos no se "almacenan" a nivel de capa de presentación. sino en un modelo de presentación ("Presentation Model", según Martin Fowler), y que la GUI es meramente una manifestación visual de ese modelo. Esto es un tema de diseño y no de "cantidades" de objetos.

Postdata:

Te agradecería que dejes de utilizar términos agresivos, novato ignorante, porque evidentemente no tenés mucha idea de cómo es el mundo fuera de tu burbuja/anomalía espacio-temporal de 1999.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-3
Comentar

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Tom (1831 intervenciones) el 16/04/2019 17:03:34
¿ Qué tienen que ver los value types con el uso de punteros, indocumentado ? ¿ Cómo crees que se accede a cualquier valor en el stack si no es mediante el uso de un puntero (repito, indirección) ?

¿ Tú haces tus programas usando solamente value types ? ¿ De verdad nunca usas herencia, en POO ? Y si usas objetos (no value types) hay vtables de por medio (y esos horribles punteros y tal) ¿ no ?


En java, un int de 32 bits sigue siendo un int de 32 bits si lo metes en un array. ¿ No te gustan las clases de Collection ? pues usa arrays.
¿ Te parece mal que un lenguaje orientado a objetos favorezca el uso de objetos frente al de primitivos ? Bueno, eso va por gustos.
Manda h... que te pongas tan cansino con los generics "de verdad".

Java no tiene value types si no consideramos los tipos primitivos. Si están implementando el soporte (en Valhalla) te aseguro que no es por ahorrar un puntero por tipo, hay otros usos que la gente desea.

A mí no me interesa que me agradezcas nada (así que paso). Lo que sí sería interesante es que dejaras de hacer el imbécil troleando el foro, diciendo chorradas.

P.D. Hay vida más allá del stack.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Billy Joel (875 intervenciones) el 16/04/2019 17:10:30
Estoy por creer que él se crea los temas y espera a que alguien le responda para salirse con un chorro de babas y decir que m$ es mejor jajajaja.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Agustin (170 intervenciones) el 16/04/2019 17:31:18
Che, de la discusión técnica no tenés nada que decir? lo único que podes decir es "m$" y el "chorro de babas" soy yo? jajaja pobres tipos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-2
Comentar
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Agustin (170 intervenciones) el 16/04/2019 17:25:42
> ¿ Qué tienen que ver los value types con el uso de punteros, indocumentado ?

Wow. Primera vez que te leo admitir la existencia de algo que no se encuentra en java en la versión actual. Vamos mejorando.

Acá te lo explica el peladito impotente de oracle: https://www.jesperdj.com/2015/10/04/project-valhalla-value-types/

The major difference between these is that a variable of a primitive type directly contains the value, for example a variable of type int contains a 32-bit value of type int, while a variable of a reference type has a level of indirection; it doesn’t contain the content of an object itself, but the address of an object that’s stored somewhere in memory

> ¿ Cómo crees que se accede a cualquier valor en el stack si no es mediante el uso de un puntero (repito, indirección) ?

Idem respuesta de arriba. No estamos hablando de como se almacenan los tipos en el stack, sino de cual es su representación interna. Una referencia a un Value Type es una referencia a un valor. Una referencia a un Reference Type es una referencia al header, que a su vez tiene otras referencias. O sea, como dice el peladito este, "a level of indirection".

> ¿ Tú haces tus programas usando solamente value types ?

No, pero los tengo disponibles y los aprovecho cuando se necesitan. Esto es algo que la gente de java (que vive en 1999) no entiende. Tampoco "hago programas" usando 100% del tiempo LINQ, pero es una herramienta espectacular, que por supuesto es muy preferible tenerla a no tenerla. Lo mismo con la lista de los 30 features de lenguaje con la que te paliceé el otro día (y que por cierto todavía no me respondiste).

> ¿ De verdad nunca usas herencia, en POO ?

Por supuesto que si, pero al contrario de java, estas NO son las únicas herramientas y abstracciones que tengo a mi disposición. Por ejemplo: el hecho de que el ecosistema de .NET haya "crecido" los últimos 15 años, con C# teniendo soporte a nivel de lenguaje para funciones (algo que java recién implementó en la versión 8 hace relativamente poco) hace que haya cientos de casos donde NO se usa herencia para redefinir o extender el comportamiento de alguna clase. Similar a como se haría en un lenguaje funcional, hay muchas librerías y frameworks que usan funciones para componer funciones. Esto es java no existe y por lo tanto hay abuso de herencia todo el tiempo, ya que ésta es básicamente la única herramienta de abstracción que java provee. Podemos concluir que java, al igual que php, tiene un umbral de abstracción muchísimo más bajo que los lenguajes modernos.

> En java, un int de 32 bits sigue siendo un int de 32 bits si lo metes en un array

Yo veo esto como una limitación, y no como una ventaja. Dí un ejemplo sencillo, pero claramente las "colecciones" NO son el único uso para los generics, y por supuesto hay abstracciones para los que un simple array no es suficiente. Para todos esos casos, java genera un desperdicio de memoria, mientras los lenguajes modernos no.

> ¿ Te parece mal que un lenguaje orientado a objetos favorezca el uso de objetos frente al de primitivos ? Bueno, eso va por gustos

Me parece mal que en 2019 un lenguaje no tenga las herramientas y features necesarios para cubrir necesidades que en otros lenguajes están resueltas hace más de una década. Evidentemente a oracle también le parece mal esto, por eso están tratando de meter value types en java.

Seguí insultando, yo voy a seguir dando argumentos técnicos. A esta altura es evidente que tu nivel de conocimiento llega hasta java y gracias, mientras yo conozco y manejo una docena de lenguajes y no me quedé en 1999.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-2
Comentar

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Tom (1831 intervenciones) el 16/04/2019 17:49:05
Mira que eres cerril. Lo hagas como lo hagas, para obtener un valor del stack (o del heap) hay que usar un puntero al inicio del stack primero y a la posición del valor después (da igual el lenguaje, de assembler para arriba).

¿ Argumentos técnicos ? Venga ya! ¿ Desde cuando algo como "tu coche es una mierda porque no tiene zyritione" es un argumento técnico ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Agustin (170 intervenciones) el 16/04/2019 17:53:58
> Mira que eres cerril. Lo hagas como lo hagas, para obtener un valor del stack (o del heap) hay que usar un puntero al inicio del stack primero y a la posición del valor después (da igual el lenguaje, de assembler para arriba).

¿Entonces oracle está perdiendo tiempo en tratar de ponerle value types a java? Estamos hablando de cosas diferentes. Lo que decís es correcto, pero lo que yo dije arriba también. Un Point3D { double X; double Y; double Z; } es mucho más eficiente como Value Type que como Reference Type.

> ¿ Argumentos técnicos ? Venga ya! ¿ Desde cuando algo como "tu coche es una mierda porque no tiene zyritione" es un argumento técnico ?

Yo enumeré las deficiencias de java, como lenguaje, plataforma, y frameworks. Si te molesta porque sos un fanboy es tu problema. Pero que las deficiencias las tiene, las tiene, y si lo comparás con cualquier lenguaje moderno, es ridículo el abismo entre java y cualquiera de ellos.

Ya te dije, si no te gusta "m$", hacé la comparacion con Kotlin, que corre sobre la propia JVM y sin embargo es un millón de veces mejor que java, desde todo punto de vista y de forma innegable. Si estoy equivocado, nombrame UNA (1) sola ventaja técnica real no inventada de java frente a Kotlin, o Scala, o cualquier lenguaje de la jvm que no se haya quedado en 1999.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Tom (1831 intervenciones) el 16/04/2019 16:13:32
Probar es casi siempre más eficaz que preguntar.
Seguro que alguien puede explicarte la "trampa".

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class TestObj {
	/* */
	static void testInteger() {
		Integer i1 = 9;
		Integer i2 = Integer.valueOf(9);
 
		if(i1 == i2) {
			System.out.println("Yes, both integers are the same object");
		} else {
			System.out.println("Integers are distinct objects");
		}
	}
	/* */
	static void testString() {
		String a1 = "Stupidity is a state of mind";
		String a2 = "Stupidity is a state of mind";
 
		if(a1 == a2) {
			System.out.println("Yes, both strings are the same object");
		} else {
			System.out.println("Strings are distinct objects");
		}
	}
	/* */
	public static void main(String args[]) {
		testInteger();
		testString();
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Rakan (9 intervenciones) el 17/04/2019 06:19:04
Sé que el operador == compara los objetos en sí en la memoria, y no su "forma".
Pero lo que no me explico, según las respuestas dicen (todos los objetos tienen su memoria donde ponen el código de todo lo que van y pueden ejecutar), es el porque en vez de decir: toString, equals, getHashcode, toObject, etc... Se repiten en 500 objetos Persona. Pues en vez de tener 500 métodos de cada tipo cargados en RAM, tengamos uno solo de cada tipo, y le llamamos desde cada objeto.
Por ejemplo, implementemos equals para una persona:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Persona {
 
int edad;
String nombre;
Aficion[] aficiones;
 
// Constructor, getters, setters y lo que sea...
 
public boolean equals(Persona persona) {
return persona.edad == edad && persona.nombre.equals(nombre) && compararArray(aficiones, persona.aficiones);
}
 
}
Si tenemos 500 personas cargadas, tendremos entronces 500 implementaciones de equals.
Pero la maquina virtual podría percatarse de esto y hacer algo así para equals:
1
2
3
static boolean personaEquals(Persona a, Persona b) {
// Misma implementación que Persona.equals
}
Y cada vez que se hace una llamada a un equals, hacer un personaEquals(this, persona)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Tom (1831 intervenciones) el 17/04/2019 09:02:16
Pero ¿ de qué respuestas hablas ?
Que no, ome, que no, que no tienes 500 veces en memoria el código de equals, ni en java ni en ningún lenguaje "de objetos".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Rodrigo (623 intervenciones) el 17/04/2019 16:12:54
Los compiladores son habiles y no hacen copia de todo.

Una manera de hacerlo para no hacer que hayan 500 copias de la funcion, es que las referencias apunten a un objeto que tiene a su vez 2 referencias, 1 a una tabla de los metodos de la clase a la que esa clase pertenece y otra al objeto mismo.

Otra manera es hacer que los objetos tengan un campo oculto que es una referencia a la tabla de metodos.

Lo que se ha hablado aqui, si eliminas los insultos personales, es que si decides usar tipos no primitivos, vas a usar mas memoria que un tipo primitivo, y para acceder a cada elemento vas a requerir una desreferencia que no tendrias si tuvieras un tipo primitivo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Varios objetos del mismo tipo comparten espacios de RAM?

Publicado por Rakan (9 intervenciones) el 17/04/2019 05:58:52
Estoy con un pequeño motor de juegos 2D y para algunos temas me venía bien saber esto para el tema de que patrones seguir.
Sabiendo que la administracion de RAM de Java no es demasiado buena, voy a tener más tendencia a seguir un patrón del estilo singleton + composite.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar