¿Existe una herramienta de línea de comandos (Linux) para verificar el tamaño de almacenamiento dinámico (y la memoria utilizada) de una aplicación Java?
Lo he intentado a través de jmap. Pero da información. sobre áreas de memoria interna como Eden / PermGen, etc., que no me son útiles.
Estoy buscando algo como:
- Memoria máxima: 1 GB
- Memoria mínima: 256 MB
- Memoria de montón: 700 MB
- Memoria utilizada: 460 MB
Eso es todo. Sé que puedo ver esto en JConsole, etc., pero necesito una herramienta de línea de comandos (no puedo habilitar JMX, etc.)
¿Conoces alguna herramienta / comando?
jstat
se deben usar para verificar solo el uso general de la memoria de una JVM? Supongamos que comienza la JVM conXms=4g
yXmx=4g
y desea ver, ¿cuánta memoria de eso ya se utiliza?jstat
Oracle Java 8 manual de la página :This command is experimental and unsupported
.awk 'print {$3+$4+$6+$8}'
puede imprimir el uso resumido en las columnas jstat de Java 8ps -ef | grep java
me mostró los argumentos vm, que en mi caso incluían el valor -Xmx, que era todo lo que necesitaba.jvmtop es una herramienta de línea de comandos que proporciona una vista en vivo de varias métricas, incluido el montón.
Ejemplo de salida del modo de visión general de VM:
fuente
Este comando muestra los tamaños de almacenamiento dinámico configurados en bytes.
Funciona en Amazon AMI en EC2 también.
fuente
Pruebe esto, funcionó en Ubuntu y RedHat:
Para ventanas:
Para Mac
La salida de todos estos comandos se asemeja a la salida a continuación:
Para encontrar el tamaño en MB, divida el valor con (1024 * 1024).
fuente
jstat -gc <vmid>
para ejecutar aplicaciones.Sin usar JMX, que es lo que usan la mayoría de las herramientas, todo lo que puede hacer es usar
e infiere que la configuración será de las opciones de la línea de comando.
No puede obtener información dinámica sin JMX de forma predeterminada, pero podría escribir su propio servicio para hacerlo.
Por cierto: prefiero usar VisualVM en lugar de JConsole.
fuente
Hay una herramienta de línea de comandos con un aspecto visual: jvm-mon . Es una herramienta de monitoreo de JVM para la línea de comando que desaparece:
Las métricas y los gráficos se actualizan mientras la herramienta está abierta.
Muestra:
fuente
Tarde en la fiesta, pero una solución muy simple es usar el script jpsstat.sh. Proporciona una simple memoria actual en vivo , memoria máxima y detalles de uso de la CPU .
Aquí está la salida de muestra del script:
fuente
En mi caso, necesitaba verificar las banderas dentro de un contenedor acoplable que no tenía la mayoría de las utilidades básicas (ps, pstree ...)
Utilizando
jps
obtuve el PID de la JVM ejecutándose (en mi caso 1) y luegojcmd 1 VM.flags
obtuve las banderas de la JVM en ejecución.Depende de los comandos que tenga disponibles, pero esto podría ayudar a alguien. :)
fuente
Desde Java8 y superior , puede usar el siguiente comando:
jcmd
JAVA_PROCESS_ID
GC.heap_infoPuede referirse a la suma de la memoria total y usada de la salida.
Para obtener más detalles sobre el comando jcmd, visite el enlace: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html
fuente
GC.heap_info
definitivamente está disponible en OpenJDK 8 también. ¿Quizás solo en versiones recientes? Estoy usando este: 8u191-b12-2ubuntu0.18.04.1Cualquier enfoque debería darte aproximadamente el mismo número. Siempre es una buena idea asignar el montón utilizando
-X..m
-X..x
todas las generaciones. Luego puede garantizar y también hacer ps para ver qué parámetros se pasaron y, por lo tanto, se están utilizando.Para los usos de memoria reales, también puede comparar aproximadamente VIRT (asignado y compartido) y RES (real utilizado) en comparación con los valores jstat:
Para Java 8, vea jstat para estos valores realmente significan. Suponiendo que ejecuta una clase simple sin mmap o procesamiento de archivos.
Max :
(aproximadamente cerca y debajo de la memoria VIRT)
Max (Min, Usado):
(aproximadamente cerca de la memoria RES)
"No me cite sobre esto", pero la memoria VIRT está más o menos cerca de la memoria máxima asignada, pero siempre que la memoria utilizada esté libre / disponible en la memoria física, JVM no arroja una excepción de memoria. De hecho, la memoria máxima ni siquiera se compara con la memoria física en el inicio de JVM, incluso con el intercambio apagado en el sistema operativo. Aquí se discute una mejor explicación de qué memoria virtual realmente utiliza un proceso Java .
fuente
Primero obtenga la identificación del proceso, el primer número del proceso listado, de uno de los siguientes: (o simplemente use
ps aux | grep java
, si lo prefiere)Luego use la ID del proceso aquí:
fuente
Usar el
top
comando es la forma más simple de verificar el uso de memoria del programa.RES
La columna muestra la memoria física real que está ocupada por un proceso.Para mi caso, tenía un archivo de 10g leído en Java y cada vez que salía de la excepción de memoria. Esto sucedió cuando el valor en la
RES
columna alcanzó el valor establecido en la-Xmx
opción. Luego, al aumentar la memoria usando la-Xmx
opción, todo salió bien.fuente
En términos de tamaño de almacenamiento dinámico de Java, en Linux, puede usar
o
y busque -Xms, -Xmx para averiguar el tamaño de almacenamiento dinámico inicial y máximo especificado.
Sin embargo, si -Xms o -Xmx están ausentes para el proceso Java que le interesa, significa que su proceso Java está utilizando los tamaños de almacenamiento dinámico predeterminados. Puede usar el siguiente comando para averiguar los tamaños predeterminados.
o un jvm particular, por ejemplo,
y busque InitialHeapSize y MaxHeapSize, que está en bytes.
fuente
Si usa jrockit, pruebe la herramienta de línea de comando jrcmd. Por ejemplo:
Para obtener más comandos, como heap_diagnostics, use "jrcmd help" para enumerarlos.
https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t
fuente
Ejemplo de O / P del comando anterior
Obtenga más detalles sobre esto en http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html
fuente
No existe una herramienta de este tipo hasta ahora para imprimir la memoria de almacenamiento dinámico en el formato que solicitó. La única y única forma de imprimir es escribir un programa java con la ayuda de Runtime Class ,
}
referencia: https://viralpatel.net/blogs/getting-jvm-heap-size-used-memory-total-memory-using-java-runtime/
fuente
Encuentre la identificación del proceso de su proceso webapp / java desde arriba. Use jmap heap para obtener la asignación del montón. Probé esto en AWS-Ec2 para el frijol elástico
Puede ver en la imagen a continuación el almacenamiento dinámico máximo de 3GB para la aplicación
fuente