¿Cómo puedo encontrar el tamaño del montón de Java y la memoria utilizada (Linux)?

6 minutos de lectura

Avatar de usuario de Jasper
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.)

avatar de usuario de farmer1992
agricultor1992

Cada proceso de Java tiene un pidque 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 con Xms=4g y Xmx=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

Avatar de usuario de Atma
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


Avatar de usuario de MRalwasser
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

avatar de usuario de padippist
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.

Avatar de usuario de Andrejs
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.

Muestra: jvm-mon

Avatar de usuario de Priyantha
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 Molchanov

    Mar 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 gupta

    Mar 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 Molchanov

    Mar 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 Molchanov

    Mar 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 Lundberg

    Sep 25, 2019 at 10:30


¿Ha sido útil esta solución?