본문 바로가기

Dev/Java

JVM GC 모니터링(Tomcat), VisualVM 사용

# VisualVM

- JAVA의 VM을 모니터링 할 수 있는 GUI 툴  

- JDK 1.7 이상의 경우 JAVA_HOME/bin 밑에 포함 되어 있음 (e.g. windows - jvisualvm.exe)

- 별도로 다운 받을 경우 : https://visualvm.java.net/


# 원격접속 준비 (서버)

- 원격으로 접속을 할 경우 host 서버측에 rmiregistry 및 jstatd 데몬 실행을 실행 시켜 놓아야 함

- jstatd 데몬 실행을 위한 policy 파일 작성 (tools.policy)

grant codebase "file:${java.home}/../lib/tools.jar" {

   permission java.security.AllPermission;

};


- rmiregistry 실행 및 jstatd 실행 

# rmiregistry 2020 &

# jstatd -p 2020 -J-Djava.security.policy=tools.policy &


** centos 의 경우 방화벽을 열어야 하는데 2020 포트 이외에 랜덤한 포트를 하나 더 연결 하므로 해당 포트를 찾아서 열던가, 방화벽을 끄도록 함.

tcp        0      0 :::2020                     :::*                        LISTEN

tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN

tcp        0      0 :::8009                     :::*                        LISTEN

tcp        0      0 :::46092                    :::*                        LISTEN   <- ** 이 포트 (랜덤 포트)


- 별도 랜덤한 포트를 연결 할때 hostname으 IP를 찾아서 연결을 시도함

만약 hostname 의 문제로 연결이 안되는 경우 클라이언트에 hosts 파일에 name 등록 후 서버 측 jstatd 에 연결할 hostname 을 명시해 줌  

# jstatd -p 2020 -J-Djava.security.policy=tools.policy -Djava.rmi.server.hostname=centos &


# VisualVM 실행 

- Remote 항목에 서버를 등록

- 해당 서버 항목의 오른쪽 버튼의 Add jstatd Connection 으로 연결 설정을 열어 포트를 2020 으로 수정 


# Visual GC 추가 

-  Tools -> Plugins 메뉴에서 Visual GC Install 후 재 시작 하면 아래와 같은 화면이 표시됨 


# JVM GC 로그 남기기 

- JVM 자체적으로 GC의 Collection 로그를 남기긱 위해서, JAVA 실행 시 옵션 추가 

- 서버에 많은 부하를 주는 내용이 아니라, 별도의 GC 모니터링이 필요 하다면 추가 

-verbose:gc -XX:+PrintGCTimeStamps -Xloggc:/usr/local/tomcat/logs/gc.log"


- 전체 실행 시간 누적 시간(초), Young GC 및 Old GC (Full GC)의 실행 정보, 수행 시간 등이 기록  

# tail gc.log

2.207: [GC pause (G1 Evacuation Pause) (young) 25M->6191K(512M), 0.0208509 secs]

3.074: [GC pause (G1 Evacuation Pause) (young) 27M->10M(512M), 0.0215781 secs]

3.335: [GC pause (G1 Evacuation Pause) (young) 31M->12M(512M), 0.0163386 secs]

17.901: [GC pause (G1 Evacuation Pause) (young) 43M->19M(512M), 0.0165513 secs]

40.583: [GC pause (G1 Evacuation Pause) (young) 158M->37M(512M), 0.3734718 secs]

42.101: [GC pause (G1 Evacuation Pause) (young) 44M->35M(512M), 0.1114258 secs]

161.958: [GC pause (G1 Evacuation Pause) (young) 68M->37M(512M), 0.1038507 secs]

172.492: [GC pause (G1 Evacuation Pause) (young) 90M->43M(512M), 0.1775954 secs]

178.975: [GC pause (G1 Evacuation Pause) (young) 72M->44M(512M), 0.1478728 secs]

191.487: [GC pause (G1 Evacuation Pause) (young) 105M->49M(512M), 0.1640510 secs]


# 참고 

- JAVA GC : http://d2.naver.com/helloworld/1329

- GC 튜닝 : http://d2.naver.com/helloworld/37111

- G1 GC 설명 : http://logonjava.blogspot.kr/2015/08/java-g1-gc-full-gc.html


'Dev > Java' 카테고리의 다른 글

JVM GC 모니터링(Tomcat), VisualVM 사용  (1) 2016.04.13
Mybatis 테스트  (1) 2014.10.30