1. 프로세스 JVM 메모리 모니터링
JVM은 각자의 Heap Memory를 가지고 운영하며, 값을 설정할 수 있다.
해당 프로세스를 기동하는 script에 추가적인 JVM option을 설정했다면 다음과 같이 ps -ef 프로세스 체크로 heap memory 설정이 가능하나, 그 외에는 단순하게 process check만으로는 식별이 불가능하다.
그럴 때는 jmap을 사용하여 판별이 가능하다.
=> ${JAVA_HOME}/jmap -heap <PID>
[weblogic@localhost bin]$ ./jmap -heap 2631 >> jmap.txt [weblogic@localhost bin]$ cat jmap.txt Attaching to process ID 2631, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.311-b25 using thread-local object allocation. Garbage-First (G1) GC with 1 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 1073741824 (1024.0MB) NewSize = 268435456 (256.0MB) MaxNewSize = 268435456 (256.0MB) OldSize = 5452592 (5.1999969482421875MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 268435456 (256.0MB) CompressedClassSpaceSize = 528482304 (504.0MB) MaxMetaspaceSize = 536870912 (512.0MB) G1HeapRegionSize = 1048576 (1.0MB) Heap Usage: G1 Heap: regions = 1024 capacity = 1073741824 (1024.0MB) used = 205398944 (195.88369750976562MB) free = 868342880 (828.1163024902344MB) 19.12926733493805% used G1 Young Generation: Eden Space: regions = 86 capacity = 248512512 (237.0MB) used = 90177536 (86.0MB) free = 158334976 (151.0MB) 36.28691983122363% used Survivor Space: regions = 32 capacity = 33554432 (32.0MB) used = 33554432 (32.0MB) free = 0 (0.0MB) 100.0% used G1 Old Generation: regions = 79 capacity = 791674880 (755.0MB) used = 81666976 (77.88369750976562MB) free = 710007904 (677.1163024902344MB) 10.315721524472268% used 57094 interned Strings occupying 6620048 bytes. |
========================================================================
또한 jstat을 통해서도 JVM 모니터링이 가능하다.
=> jstat -gcutil -h20 -t <PID> <interval(ms)> <count>
-> gcutil : gcutil 에 대해서 수행
-> -h20 : 20라인마다 header 찍음
-> -t : time stamp 프린트(JVM 이 스타트 된 이후의 시간)
[weblogic@localhost bin]$ ./jstat -gcutil -h20 -t 2631 3000 3000 >> jstat.txt [weblogic@localhost bin]$ vi jstat.txt Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 2005.2 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 2008.2 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 2011.1 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 2014.2 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 2017.1 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 2020.2 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 2023.2 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 2026.1 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 2029.2 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 2032.1 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 2035.2 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 2038.2 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 2041.2 0.00 100.00 38.82 10.32 98.30 96.33 4 0.357 1 0.109 0.467 |
- S0 : Survivor 영역 0 의 사용률 (현재의 용량에 대한 퍼센티지)
- S1 : Survivor 영역 1 의 사용률 (현재의 용량에 대한 퍼센티지)
- E : Eden 영역의 사용률 (현재의 용량에 대한 퍼센티지)
- O : Old 영역의 사용률 (현재의 용량에 대한 퍼센티지)
- P : Permanent 영역의 사용률 (현재의 용량에 대한 퍼센티지)
- YGC : Young 세대의 GC 이벤트수
- YGCT : Young 세대의 가베지 콜렉션 시간
- FGC : 풀 GC 이벤트 수
- FGCT : 풀 가베지 콜렉션 시간
- GCT : 가베지 콜렉션 총 시간
위와 같이 jstat을 활용하면 각 영역별 JVM 메모리 상황을 실시간으로 모니터링할 수 있다.
GC 로그를 확인하면 실시간으로 모니터링하는 것이 어려울 수 있기에, '실시간'에 초점을 둔다면 괜찮을 방법일 수도 있다.
단 JVM에 지속적으로 request를 날린다는 것을 참고해야 한다.
(출처 : https://jang8584.tistory.com/256)
========================================================================
2. JVM default size 확인
JAVA doc에 따르면 SUN/ORACLE Windows and Solaris/Linux JVMs의 default heap size는 64MB이나, JVM 벤더마다 다를 수 있다.
JVM의 초기 heap size를 아는 방법은 다음과 같다.
[weblogic@localhost bin]$ java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|metaspacesize|version' >> default.txt [weblogic@localhost bin]$ vi default.txt uintx ErgoHeapSizeLimit = 0 {product} uintx HeapSizePerGCThread = 87241520 {product} uintx InitialBootClassLoaderMetaspaceSize = 4194304 {product} uintx InitialHeapSize := 125829120 (약 125MB) {product} uintx LargePageHeapSizeThreshold = 134217728 {product} uintx MaxHeapSize := 1988100096 (약 1988MB) {product} uintx MaxMetaspaceSize = 18446744073709547520 {product} uintx MetaspaceSize = 21807104 {pd product} uintx ShenandoahSoftMaxHeapSize = 0 {manageable} openjdk version "1.8.0_332" |
(참고 : https://jang8584.tistory.com/257)
현재 초기 heap size는 약 125MB, 최대 heap size는 약 1988 MB이다.
이는 각각 서버의 메모리의 1/64, 1/4정도 되는 수치이다.
========================================================================
3. memory dump
JVM 안에서 memory leak이 일어난다면 dump 파일을 분석하여 추적이 가능하다.
heap dump를 생성하는 방법은 다음과 같다.
- JVM option 사용
JVM을 사용하는 프로세스에 다음과 같은 JVM option을 사용하여 OutOfMemory가 발생할 시, heap dump를 생성하게 할 수 있다.
- jmap 사용
=> jmap -dump:format=b,file=heap.hprof [process ID]
위 명령어를 사용해서 heap dump를 생성할 수 있다.
'JAVA > JAVA' 카테고리의 다른 글
HashMap (0) | 2022.12.26 |
---|---|
java/lang/object (1) | 2022.12.26 |
JMX (0) | 2022.06.14 |
request.getHeader의 ip 얻기 (0) | 2022.06.02 |
GC 종류 (0) | 2022.05.30 |