Jaspe
¿Cómo puedo verificar el tamaño del montón (y la memoria usada) de una aplicación Java en Linux a través de la línea de comandos?
Lo he intentado a través de jmap. Pero da información sobre áreas de memoria interna, como Eden, PermGen, etc., que no me es útil.
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 JConsoleetc., pero necesito hacerlo a través de la línea de comandos (no puedo habilitar JMXetc.)
agricultor1992
Cada proceso de Java tiene un pid
que primero debe encontrar con el jps
dominio.
Una vez que tenga el pid, puede usar jstat -gc [insert-pid-here]
para encontrar estadísticas del comportamiento del montón de basura recolectada.
-
jstat -gccapacity [insert-pid-here]
presentará información sobre la generación de grupos de memoria y las capacidades de espacio. -
jstat -gcutil [insert-pid-here]
presentará la utilización de cada generación como un porcentaje de su capacidad. Útil para obtener una vista rápida del uso.
Ver documentos jstat en el sitio de Oracle.
-
¿Hay alguna recomendación sobre qué opciones de
jstat
uno debería usar para verificar solo el uso general de memoria de una JVM? Digamos que inicia la JVM conXms=4g
yXmx=4g
y quieres ver, ¿cuánta memoria de eso ya se usa?– basZero
5 de febrero de 2014 a las 9:44
-
“jstat -gcutil
250 N” fue muy útil para tomar N muestras con intervalos de 250 ms y mostrar la salida como porcentajes para los espacios correspondientes. Gracias. – Kerem
14 de marzo de 2015 a las 1:57
-
Cita digna de mención de
jstat
manual oracle java 8 página:This command is experimental and unsupported
.– patryk.beza
19 mayo 2015 a las 20:20
-
awk 'print {$3+$4+$6+$8}'
puede imprimir el uso resumido en las columnas jstat de Java 8– cibersoft
1 de febrero de 2017 a las 17:37
-
o
awk 'NR>1 {print $3+$4+$6+$8}'
para omitir la primera línea con títulos de columna– arberg
4 de septiembre de 2019 a las 9:51
Atma
Este comando muestra los tamaños de almacenamiento dinámico configurados en bytes.
java -XX:+PrintFlagsFinal -version | grep HeapSize
También funciona en Amazon AMI en EC2.
-
Esto no responde a la pregunta, que pregunta específicamente cómo verificar el uso del montón de un proceso. El comando aquí enumera los valores predeterminados de JVM en todos los procesos.
– Madbreaks
30 de noviembre de 2016 a las 17:10
-
Sin embargo, es una respuesta muy útil para mí llegar a esta página a través de la búsqueda de Google sobre cómo encontrar el tamaño global del almacenamiento dinámico.
– Johan
25 de enero de 2018 a las 13:53
-
@jumping_monkey no indirecto, incorrecto. Si lo que dice es cierto, la respuesta debe editarse o puede agregar una nueva respuesta.
– Madbreaks
20 de diciembre de 2019 a las 17:58
-
El título de la pregunta inicial es lo suficientemente ambiguo como para que siga siendo una respuesta incluida. Además, es la respuesta más fácil de encontrar en Google para responder a la pregunta de configuración.
– John Haberstroh
9 de junio de 2021 a las 17:46
alwasser
jvmtop es una herramienta de línea de comandos que proporciona una vista en vivo en varias métricas, incluido el montón.
Salida de ejemplo del modo de descripción general de VM:
JvmTop 0.3 alpha (expect bugs) amd64 8 cpus, Linux 2.6.32-27, load avg 0.12
http://code.google.com/p/jvmtop
PID MAIN-CLASS HPCUR HPMAX NHCUR NHMAX CPU GC VM USERNAME #T DL
3370 rapperSimpleApp 165m 455m 109m 176m 0.12% 0.00% S6U37 web 21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager 11m 28m 23m 130m 0.00% 0.00% S6U37 web 31
19187 m.jvmtop.JvmTop 20m 3544m 13m 130m 0.93% 0.47% S6U37 web 20
16733 artup.Bootstrap 159m 455m 166m 304m 0.12% 0.00% S6U37 web 46
-
De hecho, es una gran herramienta, una especie de htop pero con métricas de jstat. Gracias por la sugerencia, @MRalwasser.
– oski86
6 mayo 2015 a las 20:28
-
solo funciona hasta java 8 debido a la dependencia de tools.jar
– cdalxndr
21/01/2021 a las 19:00
padipista
Prueba esto, funcionó en Ubuntu y RedHat:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Para ventanas:
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Para Mac
java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'
El resultado de todos estos comandos se parece al siguiente resultado:
uintx InitialHeapSize := 20655360 {product}
uintx MaxHeapSize := 331350016 {product}
uintx PermSize = 21757952 {pd product}
uintx MaxPermSize = 85983232 {pd product}
intx ThreadStackSize = 1024 {pd product}
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)
Para encontrar el tamaño en MB, divida el valor entre (1024*1024).
Sin usar JMX, que es lo que usan la mayoría de las herramientas, todo lo que puede hacer es usar
jps -lvm
e inferir que la configuración será desde las opciones de la línea de comandos.
No puede obtener información dinámica sin JMX de forma predeterminada, pero puede escribir su propio servicio para hacer esto.
Por cierto: prefiero usar VisualVM en lugar de JConsole.
Andrejs
Hay una herramienta de línea de comando con un aspecto visual: jvm-mon. Es una herramienta de monitoreo de JVM para la línea de comando que deshabilita:
- uso del montón, tamaño y máximo
- procesos jvm
- uso de cpu y GC
- hilos principales
Las métricas y los gráficos se actualizan mientras la herramienta está abierta.
Priyantha
De Java8 y superiorpuede usar el siguiente comando:
jcmd JAVA_PROCESS_ID
GC.heap_info
Puede hacer referencia a la suma de la memoria total y utilizada de la salida.
Ejemplo de comando y salida: jcmd 9758 GC.heap_info PSYoungGen total 1579520K, usado 487543K [0x0000000751d80000, 0x00000007c0000000, 0x00000007c0000000)
eden space 1354240K, 36% used [0x0000000751d80000,0x000000076f99dc40,0x00000007a4800000)
from space 225280K, 0% used [0x00000007b2400000,0x00000007b2400000,0x00000007c0000000)
to space 225280K, 0% used [0x00000007a4800000,0x00000007a4800000,0x00000007b2400000)
ParOldGen total 3610112K, used 0K [0x0000000675800000, 0x0000000751d80000, 0x0000000751d80000)
object space 3610112K, 0% used [0x0000000675800000,0x0000000675800000,0x0000000751d80000)
Metaspace used 16292K, capacity 16582K, committed 16896K, reserved 1064960K
class space used 1823K, capacity 1936K, committed 2048K, reserved 1048576K
For more details on jcmd command, visit link here
-
You need to correct your comment. GC.heap_info is available in Java 9 and above. It’s not available in the Java 8. See another thread here: stackoverflow.com/questions/41891127/…
– Pavel MolchanovMar 7, 2019 at 23:01
-
@PavelMolchanov I am able to use the command in jdk1.8.0_172. /Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home/bin/jcmd 98270 GC.heap_info. Please if you may, Add the info to referred thread as well as I don’t have enough reputation as of now to add a comment there.
– vaibhav guptaMar 19, 2019 at 7:22
-
Do you use Mac? Do you use Oracle JDK? I don’t know how it can be available in your jdk1.8.0_172, Oracle documented this feature only in Java 9 and up: docs.oracle.com/javase/9/tools/jcmd.htm. It’s not in the Oracle JDK documentation for Java 8. It’s not mentioned in the link that you gave at the bottom: docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/…
– Pavel MolchanovMar 19, 2019 at 15:20
-
One more question. Please check JDK version that is running process 98270 in your example. jcmd gets available commands from JVM of the process (in your case 98270). If process 98270 process is executed with different JDK (JDK 9 or above), you will see GC.heap_info command available even in JCMD itself is from Java 8. Available commands may be different for different processes. To get available commands execute: jcmp <PID> help.
– Pavel MolchanovMar 19, 2019 at 15:24
-
FWIW,
GC.heap_info
is definitely available in OpenJDK 8 also. Maybe only in recent versions? I am using this one: 8u191-b12-2ubuntu0.18.04.1– Per LundbergSep 25, 2019 at 10:30