Portanto, estou olhando para um heap com jmap em uma caixa remota e quero forçar a coleta de lixo nele. Como você faz isso sem acessar jvisualvm ou jconsole e amigos?
Sei que você não deve forçar a coleta de lixo - você deve apenas descobrir por que a pilha é grande / está crescendo.
Também percebo que System.GC () não força a coleta de lixo - ele apenas informa ao GC que você gostaria que ela ocorresse.
Dito isto, há uma maneira de fazer isso facilmente? Algum aplicativo de linha de comando que estou perdendo?
java
garbage-collection
jmx
jmap
Eyberg
fonte
fonte
Respostas:
Você pode fazer isso por meio do programa jmxterm gratuito .
Acenda assim:
A partir daí, você pode se conectar a um host e acionar o GC:
Consulte os documentos no site jmxterm para obter informações sobre como incorporar isso em scripts bash / perl / ruby / outros. Eu usei popen2 em Python ou open3 em Perl para fazer isso.
ATUALIZAÇÃO: aqui está um one-liner usando jmxterm:
fonte
Desde o JDK 7, você pode usar a ferramenta de comando JDK 'jcmd', como:
jcmd <pid> GC.run
fonte
Explicit GC is disabled, no GC has been performed
pode ser devido ao-XX:+DisableExplicitGC
argumento VM. Consulte: mail.openjdk.java.net/pipermail/serviceability-dev/2017-August/…Se você executar
jmap -histo:live <pid>
, isso forçará um GC completo na pilha antes de imprimir qualquer coisa.fonte
jcmd
agora é a ferramenta certa para o trabalho.Adição à resposta do usuário3198490 . A execução desse comando pode gerar a seguinte mensagem de erro:
Isso pode ser resolvido com a ajuda desta resposta stackoverflow
onde
<process_owner>
está o usuário que executa o processo com PID<pid>
. Você pode obter tanto detop
ouhtop
fonte
java.io.IOException: Operation not permitted
sudo -u <process_owner> jcmd <pid> GC.run
, você pode tentar? O comando deve ser seguroExistem algumas outras soluções (muitas boas já aqui):
gc()
.gc()
operação no MemoryMBeanO exemplo a seguir é para cmdline-jmxclient:
Isso é bom porque é apenas uma linha e você pode colocá-la em um script com muita facilidade.
fonte
para linux:
jcmd
é empacotado com o JDK,$(pgrep java)
obtém o ID do processo de javafonte
Não acho que haja qualquer opção de linha de comando para o mesmo.
Você precisará usar jvisualvm / jconsole para isso.
Eu prefiro sugerir que você use essas ferramentas para identificar por que seu programa está com muita memória.
De qualquer forma, você não deve forçar o GC, pois isso certamente perturbaria o algoritmo do GC e tornaria seu programa lento.
fonte
Se você estiver usando o jolokia com seu aplicativo, poderá acionar uma coleta de lixo com este comando:
fonte
somente:
fonte