Java - Análisis rendimiento

 
Vista:
sin imagen de perfil
Val: 17
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Análisis rendimiento

Publicado por tipitipi (9 intervenciones) el 17/01/2020 16:40:07
Hola:

De antemano Gracias a la ayuda que me puedan dar.
He desarrollado una pequeña aplicación que consiste simplemente en un jframe con un borderlayout. En cada parte del borderlayout "agrego" un jpanel. Nada más.
Posterirmente genero un fichero Test.jar y lo lanzo en tres maquinas distintas (todas ellas con la misma versión de jdk "jdk1.7.0_80") y al abrir el jconsole para observar el comportamiento veo que el comportamiento es totalmente distinto (principalemtne en la parte de memoria) y con tendencia asecendente.

A continuación adjunto los detalles que considero más significativos para el análisis y las gráficas obtenidas a través de jconsole de cada una de las máquinas tras varias horas en ejecución:

-------------------------------------------------------------------------------

W10 Enterprise
16 GB de RAM
(I7-6700HQ 2,60 GHz) * 8

W10_PORTATIL

-------------------------------------------------------------------------------

W10 Enterprise
8 GB de RAM
(Intel Xeon 5160 3,00 GHz ) x 2

W10_PC

-------------------------------------------------------------------------------


LINUX MINT 18
4 GB de RAM
(I7-6700HQ 2,60 GHz) * 4

LINUX_PORTATIL

-------------------------------------------------------------------------------

Me gustaría saber si alguien me puede ayudar con las siguientes consultas:
- ¿ por qué hay tanta diferencia en los valores registrados en las tres máquinas ? Mem Used, Commited, Max, Thread used..... etc. (principalmente en lo que se refiere a MEMORIA)
- ¿ Por que los valores de memoria son los que más diferencias tienen entre las diferentes máquinas ? El resto de valores tambien tienen diferencias, pero se asemejan más.
- ¿ El proceso Test.jar llegará a consumir toda la memoria de la máquina ? ¿ Se puede arrancar el proceso para que este utilice unos recursos limitados ?
- ¿ quién se está llevando toda esa memoria ? ¿ por qué en ocasiones se libera "de repente" ?
- ¿ hay algo que esté haciendo o interpretando erróneamente ?

Lo cierto es que el mundo java en el cual aún estoy empezando me parece increiblemente bueno, pero todos estos detalles me parecen críticos para elegirlo para realizar cierto tipo de desarrollos ya que en base a estos resultados obtenidos de un proceso que no realiza ninguna acción (salvo abrir una ventana), no me inspira ninguna confianza para realizar por ejemplo una aplicación que tenga que estar 24x7 arrancada.

Quiero remarcar que una vez arrancado el ejecutable Test.jar, no se ha realizado ninguna acción sobre él. Solo me he limitado dejarlo arrancado para ver y comparar las gráficas de rendimiento.
Adicionalmente he realizado la misma prueba pero con un proceso de consola que escribe en pantalla "Hola Mundo !!!" cada 5 segundos (retardo forzado con un sleep(5000) y el resultado en la parte de memoris es similar (lo siento pero no me ha sido posible no poder adjuntar la gráfica)

Perdón por haberme extendido tanto pero no he sabido resumirlo más.

Muchas Gracias a todos
Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de pablo
Val: 626
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Análisis rendimiento

Publicado por pablo (239 intervenciones) el 18/01/2020 00:43:04
Hola Tipitipi

Para conocer primero las diferencias de los valores al menos las variaciones que estas mostrando con respecto al Heap de memoria sería bueno decirte que el heap de memoria es la memoria dinámica que asigna tu programa en este caso por ser un poco más específico, está memoria es solicitada en los momentos de ejecución de programa, estas fluctuaciones que se observan pienso yo que se pueden deber a la cantidad de variables, clases, métodos que tenga tu programa por ende para el gestionar todo esto necesita de está memoria, y ahí te encuentras con los picos que se muestran en tu programa, otra cosa que puede afectar puede ser la frecuencia con la que estés usando tu memorias, ¿qué quiero decir con esto?, bueno que no será lo mismo una memoria que trabaje a 1600 a una que trabaje a 2600 mhz y sí están puestas en dual channel etc, también creo que podría ser el tema del procesador, por ejemplo un xeon entiendo yo es más usado para servidores por su gran velocidad de respuesta y de solicitudes que pueden llegar a manejar, en cambio con otros procesadores no se presenta este caso sino que tiende a fluctuar un poco más pues puedes estar ejecutando diversas cosas al mismo tiempo; otra cosa que puede afectar el sistema operativo, aquí pienso que estas fluctuaciones en tu memoria se pueden deber a las tareas y programas que este ejecutando tu sistema operativo en segundo plano y hagan uso de esta memoria que también influye es el normal funcionamiento de tu programa, me atrevería a decir que linux siempre es un poco mejor optimizado que windows y ademas tienes más control sobre la paqueteria que instalas y que con un simple top puedes ver.

Y otro del que casi se me olvida es el garbage collector de java. Verás desde mi punto de vista el garbage collector se encarga de eliminar las clases a las que ya no se están haciendo referencia para poder utilizar esa memoria y poder emplealar en otras clases de tu programa, sí en un principio de la era de java el garbage collector reclamaba gran potencial del equipo por ende se decía que java era lento y muy pesado hoy en día con la capacidad de procesamiento que se tiene esto se ve conciderablemente reducido o al menos eso trata siempre el equipo de oracle.

Consejos:
-Puedes probar cualquier otro lenguaje de programación y observar el comportamiento que este tiene frente al heap de memoria.
-Puedes probar versiones más recientes de java (ya que no sé si utilizas la última que está en el mercado).


Existen lenguajes muy bueno como c++ cuyo garbage collector es muy optimo y te pongo un ejemplo las criptomonedas la más famosa bitcoin esta escrita en este lenguaje estas operaciones tan grandes requieren estar activas 24/7 sin parar por ende c++ al ser un lenguaje ligero y tan bien optimizado ofrece una buen olgura a la hora de trabajar en este campo pero eso no quiere decir que java no se pueda utilizar en nada, desde mi punto de vista Java sí, es un lenguaje de programación que exige pero a cambio te puede ofrecer robustez y seguridad. Además de contar también con una gran comunidad de la cual te puedes servir y sí quieres un ejemplo que bueno no es tan grande ni tan significante como el de las criptomonedas java está presente en el juego minecraft y la cantidad de procesamiento que este utiliza es grande y más si es un servidor que mantenga dicho juego. También es utilizado en Bancos y en una que otra red social en tareas que sean puntuales, pero bueno todo depende del enfoque que le quieras ofrecer a tu programa.

Y por si quieres leer un poco más aquí unos enlaces más explicativos:

https://guru99.es/java-stack-heap/

https://ricardogeek.com/como-funciona-el-garbage-collector-de-java/

http://semanticwebbuilder.org.mx/es/DocumentacionSWB/Heap_Stack_PermGen_Memoria_en_un_JVM

https://www.arquitecturajava.com/java-garbage-collector/

Espero haberte podido ayudar en tus preguntas y responder al menos algunas de ellas.

Saludos .
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 Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Análisis rendimiento

Publicado por Rodrigo (623 intervenciones) el 18/01/2020 14:59:21
El garbage collector funciona automaticamente, y administra memoria no utilizada / no referenciada.
Esta administracion automatica tiene costo en CPU y por lo tanto no se dispara a cada rato, pero se hace evidente su actuar en un grafico como el que muestras.

Segun mi limitado conocimiento, C++ NO TIENE garbage collection. Mas bien permite la administracion manual de la memoria. Cada opcion (administracion automatica/manual) trae sus problemas.

Tal vez al mirar el codigo se podrian identificar culpables del uso/peticion/liberacion de la memoria.
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: 17
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Análisis rendimiento

Publicado por tipitipi (9 intervenciones) el 20/01/2020 00:26:25
Hola Rodrigo:

Gracias por tu respuesta.
En base a tu respuesta y a la de Pablo, he indagado en la documentación del Garbage Collector y en bse a lo que he visto, he probado a realizar pruebas con las instrucciones System.gc(); y Runtime.getRuntime().gc();.
Con ambas opciones implementadas mediante acción manual o de forma "automática" a través de un thread en el código que se ejecute cada un tiempo X (lo he ido variando entre 5sg y 600sg), evidentemente se nota mejoría en las gráficas de memoria pero por contra detecto un impacto negativo en el uso de CPU.

La opción que indicas de C/C++ la he probado hace tiempo con GTK, pero esta opción dificulta en gran medida la elaboración de una aplicación multiplataforma. Lo cierto es que la tecnología java en ese sentido es perfecta. La única pega es la que indico en estas entradas del por qué tanta diferecia en el comportamiento para una aplicación que no hace nada... Recuerdo que se trata de una aplicación gráfica realizada con la librería swing, que abre un jframe con un borderlayout. En cada parte del borderlayout "agrego" un jpanel. No tiene ninguna acción implementada... por lo que no veo justificado (independientemenete de la arquitectura que se utilice) que haya variación en el uso de memoria, de CPU, etc.

Seguiré investigando
Gracias de nuevo y un cordial saludo
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: 17
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Análisis rendimiento

Publicado por tipitipi (9 intervenciones) el 20/01/2020 00:15:03
Hola Pablo:

Gracias por tu respuesta.
He revisado los links que me indicas y he encontrado en ellos información muy interesante. AL menos al revisarlos alguna cosa nueva he aprendido, jeje.

Seguiré investigando
Gracias de nuevo y un cordial saludo
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