Así que estoy viendo un montón con jmap en una caja remota y quiero forzar la recolección de basura en él. ¿Cómo puede hacer esto sin entrar en jvisualvm o jconsole and friends?
Sé que no debería estar en la práctica de forzar la recolección de basura; solo debe averiguar por qué el montón es grande / crece.
También me doy cuenta de que System.GC () en realidad no fuerza la recolección de basura, solo le dice al GC que le gustaría que ocurra.
Habiendo dicho eso, ¿hay alguna manera de hacer esto fácilmente? ¿Alguna aplicación de línea de comandos que me falta?
java
garbage-collection
jmx
jmap
Eyberg
fuente
fuente
Respuestas:
Puede hacerlo a través del programa gratuito jmxterm .
Enciéndelo así:
Desde allí, puede conectarse a un host y activar GC:
Consulte los documentos del sitio web jmxterm para obtener información sobre cómo incrustar esto en bash / perl / ruby / otros scripts. He usado popen2 en Python o open3 en Perl para hacer esto.
ACTUALIZACIÓN: aquí hay una sola línea usando jmxterm:
fuente
Desde JDK 7, puede usar la herramienta de comando JDK 'jcmd' como:
jcmd <pid> GC.run
fuente
Explicit GC is disabled, no GC has been performed
podría deberse al-XX:+DisableExplicitGC
argumento de VM. Ver: mail.openjdk.java.net/pipermail/serviceability-dev/2017-August/…Si lo ejecuta
jmap -histo:live <pid>
, forzará un GC completo en el montón antes de que imprima algo.fuente
jcmd
Ahora es la herramienta adecuada para el trabajo.Adición a la respuesta del usuario3198490 . La ejecución de este comando puede generar el siguiente mensaje de error:
Esto se puede resolver con la ayuda de esta respuesta de stackoverflow
donde
<process_owner>
es el usuario que ejecuta el proceso con PID<pid>
. Puede obtener tanto detop
ohtop
fuente
java.io.IOException: Operation not permitted
sudo -u <process_owner> jcmd <pid> GC.run
, ¿podrías intentarlo? El comando debe ser seguroHay algunas otras soluciones (ya hay muchas buenas aquí):
gc()
.gc()
operación en MemoryMBeanEl siguiente ejemplo es para cmdline-jmxclient:
Esto es bueno porque es solo una línea y puedes ponerlo en un script muy fácilmente.
fuente
para linux:
jcmd
está empaquetado con el JDK,$(pgrep java)
obtiene el ID de proceso de javafuente
No creo que haya ninguna opción de línea de comando para lo mismo.
Necesitará usar jvisualvm / jconsole para lo mismo.
Preferiría sugerirle que utilice estas herramientas para identificar por qué su programa tiene mucha memoria.
De todos modos, no debe forzar GC, ya que ciertamente perturbaría el algoritmo GC y haría que su programa fuera lento.
fuente
Si está utilizando jolokia con su aplicación, puede activar una recolección de basura con este comando:
fuente
sólo:
fuente