사용 된 Java 힙 크기 및 메모리를 찾는 명령 줄 도구 (Linux)?


171

Java 응용 프로그램의 힙 크기 (및 사용 된 메모리)를 확인하는 명령 줄 도구 (Linux)가 있습니까?

jmap을 통해 시도했습니다. 그러나 그것은 정보를 제공합니다. Eden / PermGen 등과 같은 내부 메모리 영역에 대해서는 유용하지 않습니다.

나는 다음과 같은 것을 찾고있다 :

  • 최대 메모리 : 1GB
  • 최소 메모리 : 256MB
  • 힙 메모리 : 700MB
  • 사용 된 메모리 : 460MB

그게 다야. JConsole 등에서 이것을 볼 수 있지만 명령 줄 도구가 필요합니다 (JMX 등을 활성화 할 수 없음).

그러한 도구 / 명령을 알고 있습니까?

답변:


149

각 Java 프로세스에는가 있으며이 명령 pid을 먼저 찾아야합니다 jps.

pid가 있으면 jstat -gc [insert-pid-here]가비지 수집 힙의 동작 통계를 찾는 데 사용할 수 있습니다 .

  • jstat -gccapacity [insert-pid-here] 메모리 풀 생성 및 공간 기능에 대한 정보를 제공합니다.

  • jstat -gcutil [insert-pid-here]각 세대의 사용률을 용량의 백분율로 표시합니다. 사용량을 한눈에 파악하는 데 유용합니다.

Oracle 사이트의 jstat 문서 를 참조하십시오 .


11
jstatJVM의 전체 메모리 사용량 만 확인하기 위해 사용해야 하는 옵션이 있습니까? 하자 당신과 함께 JVM을 시작 말을 Xms=4g하고 Xmx=4g당신이 얼마나 그 메모리가 이미 사용보고 싶어?
basZero

1
"jstat -gcutil <pid> 250 N"은 250ms 간격의 N 샘플을 가져와 해당 공간에 대한 백분율로 출력을 표시하는 데 매우 유용했습니다. 감사.
Kerem

3
워스 지적 인용 jstat오라클 자바 (8) 매뉴얼 페이지 : This command is experimental and unsupported.
patryk.beza

1
awk 'print {$3+$4+$6+$8}'자바 8의 그러면 jstat 열을 요약 사용을 인쇄 할 수 있습니다
cybersoft

다른 답변에 문제가 있었지만 기본적으로 ps -ef | grep javavm args를 보여주었습니다. 내 경우에는 필요한 모든 -Xmx 값이 포함되었습니다.
xdhmoore

66

jvmtop 은 힙을 포함한 여러 메트릭에서 라이브 뷰를 제공하는 명령 줄 도구입니다.

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

실제로 jstat의 지표가있는 훌륭한 도구입니다. @MRalwasser 제안 해 주셔서 감사합니다.
oski86

65

이 명령은 구성된 힙 크기를 바이트 단위로 표시합니다.

java -XX:+PrintFlagsFinal -version | grep HeapSize

EC2의 Amazon AMI에서도 작동합니다.


26
이것은 프로세스의 힙 사용량을 확인하는 방법을 묻는 질문에 대답하지 않습니다. 여기서 명령은 모든 프로세스에서 JVM 기본값을 나열합니다.
Madbreaks

10
그러나 글로벌 힙 크기를 찾는 방법에 대한 Google 검색을 통해이 페이지에 오는 것은 매우 유용한 답변입니다.
Johan

@jumping_monkey가 간접적이지 않습니다. 당신이 말하는 것이 사실이라면, 답변을 편집하거나 새로운 답변을 자유롭게 추가해야합니다.
Madbreaks

42

Ubuntu와 RedHat에서 작동했습니다.

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Windows의 경우 :

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

Mac의 경우

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

이 모든 명령의 출력은 아래 출력과 유사합니다.

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)

크기를 MB 단위로 찾으려면 값을 (1024 * 1024)로 나누십시오.


pid로 특정 Java 프로세스의 힙, permsize, ...로 구분 된 메모리 사용량을 찾는 방법은 무엇입니까?
Gary Gauh

3
@GaryGauh 기본 힙 크기입니다. 실행중인 응용 프로그램의 사용법을 찾으려면 코드 내에서해야하거나 jconsole을 사용할 수 있습니다. 이것은 다른 많은 방법들도 있어야한다는 것을 알고 있습니다.
padippist

2
jstat -gc <vmid>응용 프로그램을 실행하는 데 사용 합니다.
Micha Wiedenmann

27

대부분의 도구가 사용하는 JMX를 사용하지 않고 사용하면됩니다.

jps -lvm

설정이 명령 행 옵션에서 오는 것으로 추론하십시오.

기본적으로 JMX가 없으면 동적 정보를 얻을 수 없지만이를 위해 고유 한 서비스를 작성할 수 있습니다.

BTW : JConsole 대신 VisualVM을 사용하는 것을 선호합니다.


25

시각적 측면 -jvm-mon 과 함께 명령 행 도구가 있습니다. 다음과 같은 명령 줄을위한 JVM 모니터링 도구입니다.

  • 힙 사용량, 크기 및 최대
  • jvm 프로세스
  • CPU 및 GC 사용량
  • 최고 실

도구가 열려있는 동안 메트릭과 차트가 업데이트됩니다.

견본: jvm-mon


1
그냥 참고 만 Java8에 대한 JVM-월 실행
tmanolatos

1
^ 이제 Java 11도 지원하는 새 버전이 있습니다.
Andrejs

11

늦었지만 파티는 매우 간단한 해결책은 jpsstat.sh 스크립트를 사용하는 것입니다. 그것은 간단한 라이브 전류 메모리 , 최대 메모리CPU 사용 세부 정보를 제공합니다.

  • 고토 GitHub의 프로젝트 와 다운로드 jpsstat.sh의 파일을
  • jpsstat.sh를 마우스 오른쪽 버튼으로 클릭 하고 권한 탭으로 이동하여 실행 파일로 만드십시오.
  • 이제 다음 명령을 사용하여 스크립트를 실행하십시오. ./jpsstat.sh

다음은 스크립트의 샘플 출력입니다.

=====  ======  =======  =======  =====
 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

SUSE Linux에서 즉시 작동하지 않는 것 같습니다 (행 38 : 선언 : -A : 유효하지 않은 옵션)
Chris

bash> = 4가 필요한 연관 배열 선언에서 오류가 발생하는 것처럼 들립니다. 또한 스크립트를 "sh jpsstat.sh"로 실행하면 다른 문제가 발생할 수 있습니다. 그렇다면 "./jpsstat.sh"로 스크립트를 실행하십시오.
amarjeetAnand

9

필자의 경우 기본 유틸리티 (ps, pstree ...)가 거의없는 도커 컨테이너 내부의 플래그를 확인해야했습니다.

를 사용하여 jps실행중인 JVM의 PID (내 경우 1)를 jcmd 1 VM.flags얻은 다음 실행중인 JVM에서 플래그를 얻었습니다.

사용 가능한 명령에 따라 다르지만 누군가에게 도움이 될 수 있습니다. :)


8

에서 Java8 이상 , 당신은 명령 아래에 사용할 수 있습니다 :

jcmd JAVA_PROCESS_IDGC.heap_info

출력에서 합계, 사용 된 메모리 및 사용 된 메모리를 참조 할 수 있습니다.

Sample Command And Output: jcmd 9758 GC.heap_info

PSYoungGen  total 1579520K, used 487543K [0x0000000751d80000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 1354240K, 36% used [0x0000000751d80000,0x000000076f99dc40,0x00000007a4800000)
  from space 225280K, 0% used [0x00000007b2400000,0x00000007b2400000,0x00000007c0000000)
  to   space 225280K, 0% used [0x00000007a4800000,0x00000007a4800000,0x00000007b2400000)
ParOldGen       total 3610112K, used 0K [0x0000000675800000, 0x0000000751d80000, 0x0000000751d80000)
  object space 3610112K, 0% used [0x0000000675800000,0x0000000675800000,0x0000000751d80000)
Metaspace       used 16292K, capacity 16582K, committed 16896K, reserved 1064960K
  class space    used 1823K, capacity 1936K, committed 2048K, reserved 1048576K

jcmd 명령에 대한 자세한 내용은 다음 링크를 방문하십시오. https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html


1
의견을 수정해야합니다. GC.heap_info는 Java 9 이상에서 사용 가능합니다. Java 8에서는 사용할 수 없습니다. 여기에서 다른 스레드를보십시오 : stackoverflow.com/questions/41891127/…
Pavel Molchanov

@PavelMolchanov jdk1.8.0_172에서 명령을 사용할 수 있습니다. /Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home/bin/jcmd 98270 GC.heap_info. 의견이 있으시면 참조 스레드에 정보를 추가하십시오. 현재 평판이 충분하지 않습니다.
vaibhav gupta

Mac을 사용하십니까? Oracle JDK를 사용하십니까? jdk1.8.0_172에서 사용 가능한 방법을 모르겠습니다. 오라클은 Java 9 이상에서만이 기능을 문서화했습니다 : docs.oracle.com/javase/9/tools/jcmd.htm . Java 8에 대한 Oracle JDK 문서에는 포함되어 있지 않습니다. docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/…
Pavel Molchanov

하나 더 질문. 예제에서 프로세스 98270을 실행중인 JDK 버전을 확인하십시오. jcmd는 프로세스의 JVM (사용 가능한 경우 98270)에서 사용 가능한 명령을 가져옵니다. 프로세스 98270 프로세스가 다른 JDK (JDK 9 이상)로 실행되면 JCMD 자체에서도 사용 가능한 GC.heap_info 명령이 Java 8의 것임을 알 수 있습니다. 사용 가능한 명령은 프로세스마다 다를 수 있습니다. 사용 가능한 명령을 얻으려면 jcmp <PID> help를 실행하십시오.
Pavel Molchanov 2016 년

1
FWIW GC.heap_info는 OpenJDK 8에서도 사용 가능합니다. 아마도 최근 버전에서만? 나는 이것을 사용하고 있습니다 : 8u191-b12-2ubuntu0.18.04.1
Per Lundberg

7

모든 접근 방식은 대략 같은 숫자를 제공해야합니다. -X..m -X..x모든 세대에 사용하여 힙을 할당하는 것이 좋습니다 . 그런 다음 어떤 매개 변수가 전달되어 사용 중인지 확인하기 위해 ps를 보장하고 수행 할 수도 있습니다.

실제 메모리 사용량의 경우 VIRT (할당 및 공유)와 RES (실제 사용)를 jstat 값과 대략 비교할 수 있습니다.

Java 8의 경우이 값이 실제로 의미하는 jstat 를 참조하십시오 . mmap 또는 파일 처리없이 간단한 클래스를 실행한다고 가정합니다.

$ 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

최대 :

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

(거의 VIRT 메모리에 가깝고 아래에 있음)

최대 (최소, 사용) :

215040 + 512 + 512 + 67072 + 430080  + 39680    +  4864  = ~ 1GB

(RES 메모리에 거의 근접)

"나에 대해 인용하지 말아라"그러나 VIRT mem은 할당 된 최대 메모리 이상에 가깝지만 사용중인 메모리가 실제 메모리에서 사용 가능 / 사용 가능한 한 JVM은 메모리 예외를 발생시키지 않습니다. 실제로, OS에서 스왑이 해제 된 경우에도 JVM 시작시 실제 메모리에 대해 최대 메모리를 검사하지 않습니다. Java 프로세스에서 실제로 사용하는 가상 메모리에 대한 자세한 설명은 여기에서 설명 합니다 .


4

먼저 다음 중 하나에서 프로세스 ID, 나열된 프로세스의 첫 번째 숫자를 가져 오십시오 (또는 ps aux | grep java원하는 경우을 사용하십시오 ).

jps -lvm

그런 다음 여기에서 프로세스 ID를 사용하십시오.

jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
jmap -permstat $MY_PID

2

사용 top명령하면 프로그램의 메모리 사용량을 확인하는 가장 간단한 방법입니다. RES열은 프로세스가 차지하는 실제 물리적 메모리를 보여줍니다.

필자의 경우 Java에서 10g 파일을 읽었으며 매번 outOfMemory 예외가 발생했습니다. 이것은 RES열의 값이 -Xmx옵션에 설정된 값에 도달 했을 때 발생 했습니다 . 그런 다음 -Xmx옵션을 사용하여 메모리를 늘리면 모든 것이 잘되었습니다.


3
top 명령은 JVM에 얼마나 많은 OS가 제공되는지 보여줍니다. 이 사람들은 JVM 내에서 힙 공간 사용량을 어떻게 볼 수 있는지 묻고 있습니다. JVM이 10g를 사용한다고해서 실제 힙 공간이 10g 데이터로 가득 찬 것은 아닙니다. jvm은 프로세스를 종료 할 때까지 힙에서 거의 메모리를 OS에서 다시 반환하지 않기 때문입니다.
linehrr

2

Java 힙 크기 측면에서 Linux에서는 다음을 사용할 수 있습니다.

ps aux | grep java

또는

ps -ef | grep java

지정된 초기 및 최대 힙 크기를 찾으려면 -Xms, -Xmx를 찾으십시오.

그러나 관심있는 Java 프로세스에 -Xms 또는 -Xmx가 없으면 Java 프로세스가 기본 힙 크기를 사용하고 있음을 의미합니다. 다음 명령을 사용하여 기본 크기를 찾을 수 있습니다.

java -XX:+PrintFlagsFinal -version | grep HeapSize

또는 특정 jvm (예 :

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

InitialHeapSize 및 MaxHeapSize (바이트 단위)를 찾으십시오.


1

jrockit을 사용하는 경우 jrcmd 명령 행 도구를 사용하십시오. 예를 들면 다음과 같습니다.

$ 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)

heap_diagnostics와 같은 추가 명령을 보려면 "jrcmd help"를 사용하여 나열하십시오.

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


1
jstat -gccapacity javapid  (ex. stat -gccapacity 28745)
jstat -gccapacity javapid gaps frames (ex.  stat -gccapacity 28745 550 10 )

위 명령의 샘플 O / P

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).

이에 대한 자세한 내용은 http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html 에서 확인 하십시오.


1

현재까지 요청한 형식으로 힙 메모리를 인쇄하는 도구는 없습니다. 인쇄 할 수있는 유일한 방법은 런타임 클래스를 사용하여 Java 프로그램을 작성하는 것입니다 .

public class TestMemory {

public static void main(String [] args) {

    int MB = 1024*1024;

    //Getting the runtime reference from system
    Runtime runtime = Runtime.getRuntime();

    //Print used memory
    System.out.println("Used Memory:" 
        + (runtime.totalMemory() - runtime.freeMemory()) / MB);

    //Print free memory
    System.out.println("Free Memory:" 
        + runtime.freeMemory() / mb);

    //Print total available memory
    System.out.println("Total Memory:" + runtime.totalMemory() / MB);

    //Print Maximum available memory
    System.out.println("Max Memory:" + runtime.maxMemory() / MB);
}

}

참조 : https://viralpatel.net/blogs/getting-jvm-heap-size-used-memory-total-memory-using-java-runtime/


이것은 잘못이다. jmap -heap <pid>가이 정보를 제공합니다
vsingh

0

위에서 webapp / java 프로세스의 프로세스 ID를 찾으십시오. jmap 힙을 사용하여 힙 할당을 가져 오십시오. 탄력적 인 beantalk에 대해 AWS-Ec2에서 이것을 테스트했습니다.

응용 프로그램의 최대 힙이 3GB 미만인 이미지를 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.