Existe uma ferramenta de linha de comando (Linux) para verificar o tamanho da pilha (e a memória usada) de um aplicativo Java?
Eu tentei através do jmap. Mas dá informações. sobre áreas de memória interna como Eden / PermGen etc., o que não é útil para mim.
Estou procurando algo como:
- Memória máxima: 1GB
- Memória mínima: 256 MB
- Memória de pilha: 700 MB
- Memória usada: 460 MB
Isso é tudo. Sei que posso ver isso no JConsole etc., mas preciso de uma ferramenta de linha de comando (não é possível ativar o JMX etc.)
Você conhece alguma dessas ferramentas / comandos?
jstat
devem ser usadas para verificar apenas o uso geral de memória de uma JVM? Digamos que você inicie a JVMXms=4g
eXmx=4g
deseje ver quanta memória já está sendo usada?jstat
da Oracle Java 8 manual de página :This command is experimental and unsupported
.awk 'print {$3+$4+$6+$8}'
pode imprimir o uso resumidos em colunas jstat de Java 8ps -ef | grep java
me mostrou os vm args, que no meu caso incluíam o valor -Xmx, que era tudo o que eu precisava.jvmtop é uma ferramenta de linha de comando que fornece uma visualização ao vivo em várias métricas, incluindo heap.
Exemplo de saída do modo de visão geral da VM:
fonte
Este comando mostra os tamanhos de heap configurados em bytes.
Também funciona no Amazon AMI no EC2.
fonte
Tente isso, funcionou no Ubuntu e RedHat:
Para Windows:
Para Mac
A saída de todos esses comandos se assemelha à saída abaixo:
Para encontrar o tamanho em MB, divida o valor com (1024 * 1024).
fonte
jstat -gc <vmid>
para aplicativos em execução.Sem usar o JMX, que é o que a maioria das ferramentas usa, tudo o que você pode fazer é usar
e inferir que as configurações serão a partir das opções da linha de comando.
Você não pode obter informações dinâmicas sem o JMX por padrão, mas pode escrever seu próprio serviço para fazer isso.
BTW: Prefiro usar o VisualVM em vez do JConsole.
fonte
Existe uma ferramenta de linha de comando com um aspecto visual - jvm-mon . É uma ferramenta de monitoramento da JVM para a linha de comandos que desativa:
As métricas e os gráficos são atualizados enquanto a ferramenta está aberta.
Amostra:
fonte
Tarde na festa, mas uma solução muito simples é usar o script jpsstat.sh. Ele fornece uma simples memória atual ao vivo , memória máxima e detalhes de uso da CPU .
Aqui está o exemplo de saída do script -
fonte
No meu caso, eu precisava verificar as bandeiras dentro de um contêiner de docker que não possuía a maioria dos utilitários básicos (ps, pstree ...)
Usando
jps
, obtive o PID da JVM em execução (no meu caso 1) e, em seguidajcmd 1 VM.flags
, obtive os sinalizadores da JVM em execução.Depende de quais comandos você tem disponível, mas isso pode ajudar alguém. :)
fonte
A partir do Java8 e superior , você pode usar o comando abaixo:
jcmd
JAVA_PROCESS_ID
GC.heap_infoVocê pode consultar a soma da memória total e usada da saída.
Para obter mais detalhes sobre o comando jcmd, visite o link: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html
fonte
GC.heap_info
está definitivamente disponível no OpenJDK 8. Talvez apenas em versões recentes? Estou usando este: 8u191-b12-2ubuntu0.18.04.1Qualquer abordagem deve fornecer aproximadamente o mesmo número. É sempre uma boa idéia alocar o heap usando
-X..m
-X..x
para todas as gerações. Você pode garantir e também fazer ps para ver quais parâmetros foram passados e, portanto, estão sendo usados.Para usos reais de memória, é possível comparar aproximadamente VIRT (alocado e compartilhado) e RES (real usado) com os valores jstat:
Para Java 8, consulte jstat para esses valores realmente significam. Supondo que você execute uma classe simples sem mmap ou processamento de arquivo.
Máx :
(aproximadamente perto e abaixo da memória VIRT)
Máx. (Mín., Usado):
(aproximadamente perto da memória RES)
"Não me cite sobre isso", mas o mem VIRT está aproximadamente próximo ou superior à memória máxima alocada, mas enquanto a memória utilizada estiver disponível / disponível na memória física, a JVM não emitirá exceção de memória. De fato, a memória máxima nem é verificada em relação à memória física na inicialização da JVM, mesmo com a troca desativada no SO. Uma explicação melhor sobre o que a memória virtual realmente usou por um processo Java é discutida aqui .
fonte
Primeiro, obtenha a identificação do processo, o primeiro número do processo listado, de uma das seguintes maneiras: (ou use apenas
ps aux | grep java
, se preferir)Em seguida, use o ID do processo aqui:
fonte
Usar o
top
comando é a maneira mais simples de verificar o uso de memória do programa.RES
A coluna mostra a memória física real que é ocupada por um processo.No meu caso, eu tinha um arquivo 10g lido em java e cada vez que saí da exceção OutOfMemory. Isso aconteceu quando o valor na
RES
coluna atingiu o valor definido na-Xmx
opção Então, aumentando a memória usando a-Xmx
opção, tudo correu bem.fonte
Em termos de tamanho de heap Java, no Linux, você pode usar
ou
e procure -Xms, -Xmx para descobrir o tamanho de heap inicial e máximo especificado.
No entanto, se -Xms ou -Xmx estiver ausente no processo Java em que você está interessado, isso significa que seu processo Java está usando os tamanhos de heap padrão. Você pode usar o seguinte comando para descobrir os tamanhos padrão.
ou uma jvm específica, por exemplo,
e procure InitialHeapSize e MaxHeapSize, que está em bytes.
fonte
Se estiver usando o jrockit, tente a ferramenta de linha de comando jrcmd. Por exemplo:
Para mais comandos, como heap_diagnostics, use "jrcmd help" para listá-los.
https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t
fonte
O / P de amostra do comando acima
Obtenha mais detalhes sobre isso em http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html
fonte
Até o momento, não existe essa ferramenta para imprimir a memória heap no formato solicitado. A única maneira de imprimir é escrever um programa java com a ajuda da Runtime Class ,
}
referência: https://viralpatel.net/blogs/getting-jvm-heap-size-used-memory-total-memory-using-java-runtime/
fonte
Encontre a identificação do processo do seu processo webapp / java de cima. Use jmap heap para obter a alocação de heap. Eu testei isso no AWS-Ec2 para pé de feijão elástico
Você pode ver na imagem abaixo a pilha máxima de 3 GB para o aplicativo
fonte