Foros del Web » Programación para mayores de 30 ;) » Java »

Duda sobre consumo memoria y objetos

Estas en el tema de Duda sobre consumo memoria y objetos en el foro de Java en Foros del Web. Hola muy buenas. Soy "newbe" aquí y en Java y me gustaría resolver dudas y contribuir a donde pueda (aunque será poco). Aquí va mi ...
  #1 (permalink)  
Antiguo 30/08/2014, 12:02
Avatar de ladysun  
Fecha de Ingreso: agosto-2014
Ubicación: Alicante
Mensajes: 4
Antigüedad: 9 años, 8 meses
Puntos: 0
Duda sobre consumo memoria y objetos

Hola muy buenas. Soy "newbe" aquí y en Java y me gustaría resolver dudas y contribuir a donde pueda (aunque será poco). Aquí va mi duda :)

Imaginaros que me hago una clase heredada de "JFrame" y tengo un puñado de objetos "Component". Entonces pienso que podría hacer un array donde cada posición tenga un ArrayList de cada tipo de componentes. Por ejemplo en la posición "0" sea un ArrayList<Label>, la "1" ArrayList<Button> etc.

La duda es que no me queda muy claro como impacta esto en el consumo de memoria. Un ArrayList inicializado pero vacio sería como si hubiera inicializado un objeto. Cada objeto que añada a la lista sería un objeto más en memoria. ¿Pero y el array? ¿solo guarda la dirección de cada ArrayList? ¿Cuánto ocupa en memoria?

Cuando somos novatos chupamos memoria por un tubo.

Gracias Guys.
  #2 (permalink)  
Antiguo 30/08/2014, 13:29
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Duda sobre consumo memoria y objetos

No impacta apenas.

Ten en cuenta que una lista no es más que una lista de posiciones de memoria, así que lo que importa en realidad es el tamaño de los objetos que enlaza la lista, porque mientras exista un enlace a ellos exciten en memoria. Lo normal es que tengas en memoria objetos que sí vas a necesitar habitualmente y/o que sean costosos de crear.

En el caso de los novatos no es habitual que necesitéis grandes cantidades de memoria porque vuestras aplicaciones suelen ser sencillas. Cuando tenéis problemas de memoria suele ser por desconocimiento de cómo funcionan las cosas, por ejemplo usando mal los bucles ose creen constantemente JFrame cuando en realidad lo que necesitan es reutilizar el ya creado.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 30/08/2014, 13:30
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Duda sobre consumo memoria y objetos

Hola:

En java no se sabe a ciencia cierta cuánto ocupa un objeto, ya que algo como un ArrayList, incluso sin elementos, es una clase java que tiene sus atributos y sus cosas.

No te preocupes de la memoria porque aunque no sepas cuanto ocupa una clase java, ten en cuenta que estás hablando de Megas (millones de bytes) de memoria disponibles mientras que un objeto "normal" no ocupa más que unos centenares de bytes.

Debes preocuparte de la memoria si quieres guardar mogollón de objetos, por ejemplo, que leas de una base de datos o de ficheros grandes (de megas) y quieres mentenerlo todo en memoria.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #4 (permalink)  
Antiguo 30/08/2014, 13:55
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Duda sobre consumo memoria y objetos

Hola,

Adicionalmente a lo que ya comentaron ...

Cita:
Iniciado por ladysun Ver Mensaje
... ¿Cuánto ocupa en memoria? ...
La cantidad exacta habría que comprobarla con un ejemplo real corriendo dentro de la JVM.

Ahora bien, el problema que miro yo en este caso, no es el consumo de memoria; no veo el motivo por el cual necesitas crear un ArrayList con los componentes de un JForm, puesto que el JForm en si mismo mantiene una referencia a los componentes que lo conforman, y estos se pueden comunicar y listar por medio de la API del JForm o JContainer.

Aunque habría que saber el motivo por el cual necesitas el ArrayList para definir realmente si es buena idea o no.

Cita:
Iniciado por chuidiang Ver Mensaje
... Debes preocuparte de la memoria si quieres guardar mogollón de objetos, por ejemplo, que leas de una base de datos o de ficheros grandes (de megas) y quieres mentenerlo todo en memoria. ...
Esa es una de las ventajas del lenguaje, casi todo se puede determinar con anterioridad, normalmente no hay sustos, sino son solo por desconocimiento. Por eso, ese concepto (del mogollon de objetos) hay que tomarlo con cierto recelo, principalmente cuando hay un par de proceso, consumiendo un mogollon de objetos consumiendo pequeños mogollones de memoria; como el caso de Swing (a nivel medio y avanzado).

Saludos,
  #5 (permalink)  
Antiguo 30/08/2014, 16:09
Avatar de ladysun  
Fecha de Ingreso: agosto-2014
Ubicación: Alicante
Mensajes: 4
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Duda sobre consumo memoria y objetos

Gracias por aclararme las cuestiones sobre memoria.

Cita:
Ahora bien, el problema que miro yo en este caso, no es el consumo de memoria; no veo el motivo por el cual necesitas crear un ArrayList con los componentes de un JForm, puesto que el JForm en si mismo mantiene una referencia a los componentes que lo conforman, y estos se pueden comunicar y listar por medio de la API del JForm o JContainer.
El ejemplo de la duda viene por los problemas que estoy teniendo con la organización de lo elementos en interfaces gráficas medianitas. Todos los manuales que encuentras son pequeñas introducciones a Swing. No he encontrado ningún manual que me ayuda a como "organizar", es decir, usar algún patrón o consejos sobre como organizar las clases cuando haces interfaces gráficas.

¿1 clase por ventana? ¿1 clase por JPanel creado? Si es una clase por panel ¿cómo obtengo información de otros elementos de otro panel? ¿Protect, referencia al otro objeto, por constructor? Por ejemplo tengo un botón de un panel A que actualiza un TextArea en otro panel B, pero tenga una clase Z que es la que maneja los eventos.
  #6 (permalink)  
Antiguo 31/08/2014, 12:35
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Duda sobre consumo memoria y objetos

Hola,

Cita:
Iniciado por ladysun Ver Mensaje
... ¿1 clase por ventana? ¿1 clase por JPanel creado? ...
La cantidad de clases va a depender de lo que necesites hacer. Pero si aplicas las bases de la programación orientada a objetos, sabrás que cada clase define una entidad.

Por ejemplo, si un JPanel heredado no extiende la funcionalidad de otro JPanel lo suficiente para declararse independiente, no tiene sentido hacer una clase para cada JPanel.

Ahora bien, como en Swing cada JPanel normalmente contiene muchos elementos diferentes y se puede reutilizar. Habrá que ver si vale la pena o no, en cada caso por aparte, saber si se debe extender JPanel, y crear una clase por aparte o usar el JPanel base y solamente agregarle los componentes.

Cita:
Iniciado por ladysun Ver Mensaje
... Si es una clase por panel ¿cómo obtengo información de otros elementos de otro panel? ...
Los componentes 'Component' dentro de un contenedor 'Container' se almacenan en variables; de nuevo, aplicando OOP, se aplican las mismas reglas de cualquier variable, su accesibilidad puede ser pública, privada, protegida y de paquete. Y por encapsulación debes crear los respectivos 'getter' para tener acceso a una variable privada.

Por ejemplo:

Código Java:
Ver original
  1. private JLabel jLabel = new JLabel("Hola");
  2.  
  3. public JLabel getTheLabel() {
  4.   return jLabel;
  5. }

Ahora, si revisas la documentación del JFrame vas a encontrar varios métodos que comienzan con getCompo.. (heredados de la clase Container), que te sirven para tener acceso a todos los componentes. Te devuelve un Array de Component, pero identificar cual es cual es tan simple como:

Código Java:
Ver original
  1. for (Component c : MyFrame.getComponents()) {
  2.   if (c instanceof JLabel) {
  3.     System.out.println("El componente " + String.valueOf(c) + " es un Label);
  4.  }
  5. }

Que es casi lo mismo que el ArrayLista que estabas creando, con la diferencia que aquí, todos los componentes están juntos, no los JLabel separados de los JOtraCosa.

Cita:
Iniciado por ladysun Ver Mensaje
... ¿Protect, referencia al otro objeto, por constructor? ...
Esa no la entiendo, revisa la documentación de 'protect'.

Cita:
Iniciado por ladysun Ver Mensaje
... Por ejemplo tengo un botón de un panel A que actualiza un TextArea en otro panel B, pero tenga una clase Z que es la que maneja los eventos.
Para obtener el TextArea de la clase B (supuestamente un JPanel), solamente tienes que tener acceso al objeto B ya instanciado. Aplicando los getters que mencioné antes:

Código Java:
Ver original
  1. JPanelB.getMyTextArea()

Donde JPanelB es la referencia a la instancia que mantienes en algún lugar del programa para poder usarlo. Por lo visto, pareciera que la clase Z que maneja los eventos, debería de haber creado el objeto JPanelA y JPanelB, y por lo tanto debería de tener acceso a ellos en alguna variable.

Si fuera de otra forma que el A hubiera creado B y Z recibe el evento de A, entonces A debería de tener conocimiento de B (puesto que el lo creo) y posiblemente deberías crear un 'getter' para el JPanel (como el ejemplo del getter anterior, por ejemplo: JPanelA.getMyJPanelB() que devuelva el JPanel B).

Las posibilidades son muchas, así que es difícil saber con exactitud la estructura de tu programa.

Saludos,

ps:

En los personal no aconsejaría las variables 'public static' que facilitan tener acceso a los componentes de otro contenedor. Si quieres hacerlo de la forma 'fácil' busca información sobre la palabra reservada 'static'. Aunque con el tiempo te vas a dar cuenta, que los Componentes static en Swing son mas un problema que una solución.

Última edición por HackmanC; 31/08/2014 a las 12:50 Razón: ps
  #7 (permalink)  
Antiguo 04/09/2014, 10:36
Avatar de ladysun  
Fecha de Ingreso: agosto-2014
Ubicación: Alicante
Mensajes: 4
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Duda sobre consumo memoria y objetos

Muchas gracias HackmanC por los consejos. Puedes encontrar información de sobra sobre cada componente, frame y jpanel pero no patrones ni guías de buen diseño.

Me doi cuenta que un gran error que cometemos es evitar la info oficial por "ser compleja". Buscamos guias fáciles y al final no aprendemos las recomendaciones oficiales.
  #8 (permalink)  
Antiguo 04/09/2014, 23:10
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Duda sobre consumo memoria y objetos

Hola,

Cita:
Iniciado por ladysun Ver Mensaje
... Puedes encontrar información de sobra sobre cada componente, frame y jpanel pero no patrones ni guías de buen diseño. ...
Es cierto, toda la información necesaria sobre cada uno de los componentes de casi cualquier API la encuentras en los JavaDocs. También creo que encuentras muchas guías de patrones y buen diseño.

La diferencia está en que dichas guías, así como lo indicas, son complejas y algunas veces no 'dan ganas'. Por ejemplo, en lo que expliqué anteriormente se aplica un patrón de diseño llamado encapsulación, mencionado en los Java Beans.

¿Pero qué es más fácil, hacer lo que te indiqué o usar public static?

Ciertamente la mayoría usaría public static, aquí mismo en el foro recuerdo una ocasión donde se hablo del mismo tema, y el usuario que hizo la pregunta optó por la última, static.

Para explicar el motivo por el cual yo mencioné que no era adecuado tendría que adentrarme en la Windows API y los Device Context, y es algo que seguramente muy pocos le interesará. Y ese es el motivo por el cual creo que no encontrarás demasiadas guías de patrones de diseño.

Cita:
Iniciado por ladysun Ver Mensaje
... Me doi cuenta que un gran error que cometemos es evitar la info oficial por "ser compleja". Buscamos guias fáciles y al final no aprendemos las recomendaciones oficiales.
Definitivamente es cierto, pero en mi opinión personal, el problema en algunos casos es que la mayoría de las documentación 'importante' está en otro idioma, y seguidamente porque es realmente compleja, y algunas, aunque pocas, inaccesible.

Para muestra un botón, si quisieras dominar realmente el lenguaje Java (solo el lenguaje) en su totalidad tendrías que comprender "The Java® Language Specification". Supongo que para la mayoría sería demasiado.

http://docs.oracle.com/javase/specs/...tml/index.html

Saludos,

Etiquetas: clase, consumo, jframe, memoria, objetos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:37.