source

Java 힙 크기 및 사용된 메모리(Linux)를 찾는 방법

topadmin 2023. 1. 6. 19:56

Java 힙 크기 및 사용된 메모리(Linux)를 찾는 방법

명령줄에서 Linux에서 Java 응용 프로그램의 힙 크기(및 사용된 메모리)를 확인하려면 어떻게 해야 합니까?

jmap을 사용해 보았습니다.그러나 Eden/PermGen 등의 내장 메모리 영역에 대한 정보를 제공하므로 유용하지 않습니다.

다음과 같은 것을 찾고 있습니다.

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

그게 다예요.JConsole 등에서 볼 수 있는 것은 알고 있습니다만, 커맨드 라인에서 볼 필요가 있습니다.(JMX 등을 유효하게 할 수 없습니다).

에는 "Java "가 .pid가 있습니다.jps명령어를 입력합니다.

하면 PID를 사용할 수 .jstat -gc [insert-pid-here]가비지 수집 힙 동작 통계 정보를 검색합니다.

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

  • jstat -gcutil [insert-pid-here]는 각 세대의 사용률을 용량의 퍼센티지로 나타냅니다.을 사용하다

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

이 명령어는 설정된 힙사이즈를 바이트 단위로 표시합니다.

java -XX:+PrintFlagsFinal -version | grep HeapSize

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

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

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)로 값을 나눕니다.

대부분의 툴이 사용하는 JMX를 사용하지 않고 사용할 수 있는 것은

jps -lvm

명령줄 옵션에서 설정이 나오는 것을 유추합니다.

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

BTW: 저는 JConsole보다 Visual VM을 사용하는 것을 선호합니다.

시각적인 측면을 가진 명령줄 도구 jvm-mon이 있습니다.이 툴은 명령줄용 JVM 모니터링 툴로 다음과 같은 기능을 제공합니다.

  • 힙 사용량, 크기 및 최대
  • jvm 프로세스
  • CPU 및 GC 사용률
  • 톱 스레드

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

샘플:

Java8 이상에서는 다음 명령을 사용할 수 있습니다.

jcmdJAVA_PROCESS_IDheap_infoGCheap_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 명령어에 대한 자세한 내용은 여기를 참조하십시오.

파티는 늦었지만 매우 간단한 해결책은 jpsstat를 사용하는 것입니다.sh 스크립트현재 메모리, 최대 메모리CPU 사용률에 대한 간단한 상세 정보를 제공합니다.

  • Goto GitHub 프로젝트jpsstat 다운로드.sh 파일
  • jpsstat.sh 및 goto permissions 탭을 오른쪽 클릭하여 실행 가능 상태로 만듭니다.
  • 이제 ./jpsstat 명령을 사용하여 스크립트를 실행합니다.

다음으로 스크립트의 출력 예를 나타냅니다.

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

저 같은 경우에는 도커 컨테이너 내의 깃발을 체크해야 했습니다.도커 컨테이너에는 기본적인 유틸리티(ps, pstree...)가 거의 없습니다.

「」를 사용합니다.jps 중인이1)를 취득한 후, 「JVM」PID(「」1)를 취득했습니다.jcmd 1 VM.flagsJVM을 이용하다

사용할 수 있는 명령에 따라 다르지만 다른 사용자에게 도움이 될 수 있습니다.:)

어떤 접근법에서도 대략 같은 수치를 얻을 수 있습니다.하는 방법은 히프를 할당하는 .-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 메모리에 거의 근접)

"Don't me quote to this" (이것에 대해 인용하지 말아 주세요)라고 하지만 VIRT 메모리는 할당된 최대 메모리 수에 거의 가깝거나 더 많습니다.그러나 물리 메모리에서 사용 가능한 메모리가 있는 한 JVM은 메모리 예외를 발생시키지 않습니다.실제로 최대 메모리는 OS에서 스왑오프하더라도 JVM 부팅 시 물리적 메모리와 비교조차 되지 않습니다.Java 프로세스에서 실제로 사용되는 가상 메모리에 대한 자세한 설명은 다음과 같습니다.

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(바이트 단위)를 찾습니다.

먼저 다음 중 하나에서 프로세스 ID(목록에 있는 프로세스의 첫 번째 번호)를 가져옵니다(또는 그냥 사용).ps aux | grep java(원하신다면)

jps -lvm

다음으로 프로세스 ID를 사용합니다.

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

웹 앱/자바 프로세스의 프로세스 ID를 위에서 찾습니다.jmap 힙을 사용하여 힙 할당을 가져옵니다.AWS-Ec2에서 탄성 콩줄기를 테스트했습니다.

어플리케이션의 최대 3GB 이하의 이미지에서 확인할 수 있습니다.

여기에 이미지 설명 입력

사용.top명령어는 프로그램의 메모리 사용량을 확인하는 가장 간단한 방법입니다. RES컬럼은 프로세스가 점유하고 있는 실제 물리 메모리를 나타냅니다.

제 경우 10g 파일을 Java로 읽었는데 매번 out Of Memory 예외가 발생했습니다.이 문제는 의 값이RES에서 설정된 값에 도달한 열-Xmx선택.그런 다음 다음 를 사용하여 메모리를 늘림으로써-Xmx모든 게 잘 풀렸어요

당신이 요청형식으로 히프메모리를 인쇄하는 툴은 지금까지 없었습니다.인쇄하는 유일한 방법은 런타임 클래스의 도움을 받아 자바 프로그램을 작성하는 것입니다.

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/

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

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 를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/12797560/how-to-find-java-heap-size-and-memory-used-linux