sólidos solidos sobre residuos reciclaje politicas politica nacional manejo disposición colombia charla ambiental java garbage-collection jmx jmap

java - solidos - ¿Cómo fuerzas la recolección de basura del Shell?



residuos solidos en colombia 2016 (8)

Así que estoy buscando un montón con jmap en un cuadro remoto y quiero forzar la recolección de basura en él. ¿Cómo se hace esto sin aparecer en jvisualvm o jconsole y amigos?

Sé que no deberías estar en la práctica de forzar la recolección de basura, solo debes averiguar por qué el montón es grande / está creciendo.

También me doy cuenta de que System.GC () en realidad no fuerza la recolección de basura, simplemente 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 comando que me falta?


Además de la respuesta del user3198490 . Ejecutar este comando podría darle el siguiente mensaje de error:

$ jcmd 1805 GC.run [16:08:01] 1805: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded ...

Esto se puede resolver con la ayuda de esta respuesta

sudo -u <process_owner> jcmd <pid> GC.run

donde <process_owner> es el usuario que ejecuta el proceso con PID <pid> . Puedes obtener ambos desde top o htop


Desde JDK 7 puede usar la herramienta de comando JDK ''jcmd'', como:

jcmd <pid> GC.run


Hay algunas otras soluciones (muchas buenas aquí ya):

  • Escriba un pequeño código para acceder al MemoryMBean y llame a gc() .
  • Usar un cliente JMX de línea de comando (como cmdline-jmxclient , jxmterm ) y ejecutar la operación gc() en el MemoryMBean

El siguiente ejemplo es para el cmdline-jmxclient:

$ java -jar cmdline-jmxclient-0.10.3.jar - localhost:3812 ''java.lang:type=Memory'' gc

Esto es bueno porque es solo una línea y puedes ponerla en un script muy fácilmente.


No creo que haya ninguna opción de línea de comando para el mismo.

Deberá usar jvisualvm / jconsole para lo mismo.

Preferiría sugerirle que use estas herramientas para identificar, por qué su programa tiene mucha memoria.

De todos modos, no deberías forzar a GC, ya que sin duda alteraría el algoritmo GC y haría que tu programa fuera lento.


Puedes hacerlo a través del programa jmxterm gratuito.

Enciéndalo así:

java -jar jmxterm-1.0-alpha-4-uber.jar

Desde allí, puede conectarse a un host y activar GC:

$>open host:jmxport #Connection to host:jmxport is opened $>bean java.lang:type=Memory #bean is set to java.lang:type=Memory $>run gc #calling operation gc of mbean java.lang:type=Memory #operation returns: null $>quit #bye

Consulte los documentos en el sitio web de jmxterm para obtener información sobre cómo incrustar esto en scripts bash / perl / ruby ​​/ other. He usado popen2 en Python o open3 en Perl para hacer esto.

ACTUALIZACIÓN: aquí hay una línea usando jmxterm:

echo run -b java.lang:type=Memory gc | java -jar jmxterm-1.0-alpha-4-uber.jar -n -l host:port


Si ejecuta jmap -histo:live , eso forzará un GC completo en el montón antes de que se imprima algo.


Si está utilizando jolokia con su aplicación, puede activar una recolección de basura con este comando:

curl http://localhost:8558/jolokia/exec/java.lang:type=Memory/gc


sólo:

kill -SIGQUIT <PID>