Ferramenta de linha de comandos para encontrar o tamanho e memória de Heap Java usados (Linux)?

Existe uma ferramenta de linha de comandos (Linux) para verificar o tamanho do Heap (e a memória usada) de uma aplicação Java?

Já tentei o jmap. Mas dá informações. sobre áreas de memória interna como Eden/PermGen etc. o que não me é útil.

Estou à procura de algo do género: Memória máxima: 1GB
Memória Min: 256 MB
Memória de Heap: 700 MB
Memória utilizada: 460 MB

Só isso. Eu sei que posso ver isso em JConsole etc., mas eu preciso de uma ferramenta de linha de comando (não pode activar o JMX etc.)

alguma dessas ferramentas / comandos?

Author: Jasper, 2012-10-09

13 answers

Cada processo Java tem um pid, que primeiro precisa de encontrar com o comando jps.

Uma vez que você tem o pid, você pode usar {[[2]} para encontrar estatísticas do comportamento do monte de lixo coletado.

  • jstat -gccapacity [insert-pid-here] irá apresentar informações sobre a geração de reservas de memória e capacidades espaciais.

  • jstat -gcutil [insert-pid-here] apresentará a utilização de cada geração em percentagem da sua capacidade. Útil para obter uma vista de relance de uso.

Veros documentos da jstat no site da Oracle.

 113
Author: farmer1992, 2017-02-01 20:03:34

O Jvmtop é uma ferramenta de linha de comandos que oferece uma vista ao vivo em várias métricas, incluindo heap.

Exemplo de saída do modo de visão geral da 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
 58
Author: MRalwasser, 2015-11-20 18:29:21

Este comando mostra os tamanhos de heap configurados em 'bytes'.

java -XX:+PrintFlagsFinal -version | grep HeapSize
Também funciona na Amazon AMI na EC2.
 43
Author: Atma, 2017-12-13 22:44:18
Tenta isto. funcionou no Ubuntu e no RedHat.
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Para As Janelas:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

Para Mac

java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'

O resultado de todos estes comandos assemelha-se ao resultado abaixo:

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 o tamanho em MB, divida o valor com (1024 * 1024).

 26
Author: padippist, 2017-12-13 22:45:59

Sem usar o JMX, que é o que a maioria das ferramentas usa, tudo o que pode fazer é usar

jps -lvm

E inferir que a configuração será a partir das opções da linha de comandos.

Você não pode obter informações dinâmicas sem JMX por padrão, mas você poderia escrever o seu próprio serviço para fazer isso.

BTW: prefiro usar VisualVM em vez de JConsole.

 20
Author: Peter Lawrey, 2012-10-09 10:09:26

Existe uma ferramenta de linha de comandos com um aspecto visual - jvm-mon . É uma ferramenta de monitorização JVM para a linha de comandos que desaplys:

  • Uso do heap, tamanho e máximo
  • processos jvm
  • utilização do cpu e do GC
  • tópicos de topo

As métricas e gráficos actualizam-se enquanto a ferramenta está aberta.

Amostra: jvm-mon

 11
Author: Andrejs, 2017-02-17 16:44:24
Tarde na festa, mas uma solução muito simples é usar o jpsstat.sh guião. Ele fornece uma simples memória viva , Max memory and cpu use details.
  • Goto GitHub project and download the jpsstat.sh ficheiro
  • carregue com o botão direito em jpsstat.sh e gotopermissões tab e torná-lo executável
  • execute agora o programa com o seguinte comando ./jpsstat.sh

Aqui está o resultado da amostra do script -

=====  ======  =======  =======  =====
 PID    Name   CurHeap  MaxHeap  %_CPU
=====  ======  =======  =======  =====
2777   Test3      1.26     1.26    5.8
2582   Test1      2.52     2.52    8.3
2562   Test2      2.52     2.52    6.4
 5
Author: amarjeetAnand, 2018-06-10 05:53:34

Em termos de tamanho de heap Java, no Linux, você pode usar

ps aux | grep java

Ou

ps -ef | grep java

E procurar por-Xms, - Xmx para descobrir o tamanho inicial e máximo de heap especificado.

No entanto, se-Xms ou-Xmx estiver ausente para o processo Java em que está interessado, significa que o seu processo Java está a usar os tamanhos de heap predefinidos. Você pode usar o seguinte comando para descobrir os tamanhos padrão.

java -XX:+PrintFlagsFinal -version | grep HeapSize

Ou uma determinada jvm, por exemplo,

/path/to/jdk1.8.0_102/bin/java -XX:+PrintFlagsFinal -version | grep HeapSize

And look for InitialHeapSize e MaxHeapSize, que está em bytes.

 2
Author: Yuci, 2016-12-08 11:40:26

Primeiro obter o id do processo, o primeiro número do processo listado, a partir de um dos seguintes: (ou apenas usar ps aux | grep java, se preferir que)

jps -lvm

Então use o ID do processo aqui:

jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
jmap -permstat $MY_PID
 2
Author: sjas, 2017-06-11 13:53:55

Qualquer abordagem deve dar-te 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, então, garantir e também fazer ps para ver quais parâmetros foram passados e, portanto, ser usado.

Para as utilizações actuais da memória, poderá comparar aproximadamente VIRT (atribuído e partilhado) e RES (usado de facto) com os valores jstat também:

Para Java 8, ver jstat para estes valores, na verdade, significa. Assumindo que corres um simples classe sem mmap ou processamento de ficheiros.

$ jstat -gccapacity 32277 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC 215040.0 3433472.0 73728.0 512.0 512.0 67072.0 430080.0 6867968.0 392704.0 392704.0 0.0 1083392.0 39680.0 0.0 1048576.0 4864.0 7225 2

$ jstat -gcutil 32277 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 6.25 0.00 7.96 18.21 98.01 95.29 7228 30.859 2 0.173 31.032

Max : NGCMX + S0C + S1C + EC + OGCMX + MCMX + CCSMX 3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB

(aproximadamente perto e abaixo da memória VIRT)

Max (Min, Usado): 215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB

(aproximadamente perto da memória RES)

"não me cites nisto" mas VIRT mem está aproximadamente perto ou mais do que a memória máxima atribuída, mas desde que a memória a ser usada esteja livre / disponível na memória física, o JVM não abre excepção à memória. Na verdade, max memory não é até comparei com a memória física no arranque da JVM, mesmo com a troca no SO. Uma melhor explicação do que a memória Virtual realmente usada por um processo Java é discutida aqui .

 2
Author: kisna, 2018-07-03 09:52:42

Se usar o jrockit tente a ferramenta da linha de comandos jrcmd. Por exemplo:

$ jrcmd 5127 print_memusage
5127:
Total mapped                  1074596KB           (reserved=3728KB)
-              Java heap       786432KB           (reserved=0KB)
-              GC tables        26316KB          
-          Thread stacks        13452KB           (#threads=34)
-          Compiled code         9856KB           (used=9761KB)
-               Internal          840KB          
-                     OS        15036KB          
-                  Other       146632KB          
-        Java class data        75008KB           (malloced=74861KB #103221 in 18709 classes)
- Native memory tracking         1024KB           (malloced=102KB #8)

Para mais comandos, como o heap_ Diagnostics, use o "jrcmd help" para listá-los.

Https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t

 1
Author: guest, 2013-05-17 03:40:39

Usar o comando top é a forma mais simples de verificar o uso da memória do programa. RES a coluna mostra a memória física real que é ocupada por um processo.

Para o meu caso, tinha um ficheiro 10g lido em java e cada vez que saía da minha excepção. Isto aconteceu quando o valor na coluna RES atingiu o valor definido na opção -Xmx. Então, aumentando a memória usando a opção -Xmx tudo correu bem.
 1
Author: M. Mashaye, 2015-12-15 18:07:53
jstat -gccapacity javapid  (ex. stat -gccapacity 28745)
jstat -gccapacity javapid gaps frames (ex.  stat -gccapacity 28745 550 10 )

Amostra O / P do comando acima

NGCMN    NGCMX     NGC     S0C  
87040.0 1397760.0 1327616.0 107520.0 

NGCMN   Minimum new generation capacity (KB).
NGCMX   Maximum new generation capacity (KB).
NGC Current new generation capacity (KB).

Obtenha mais detalhes sobre isto em http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html

 1
Author: Pravin, 2016-12-07 22:02:44