본문 바로가기
백엔드/Java

jstat - JVM 통계 데이터 감시 툴

by david100gom 2009. 8. 12.
728x90

형식

jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
generalOption
단독으로 사용하는 일반적인 커멘드행 옵션입니다 (-help, -options, 또는 -version).
outputOptions
단일의 statOption 와-t, -h, 및 -J 옵션의 어느쪽이든을 조합한, 1 개(살) 또는 복수의 출력 옵션입니다.
vmid
타겟의 Java 가상 머신 (JVM)을 나타내는 캐릭터 라인인 가상 머신 식별자입니다. 일반적인 구문은 다음과 같이 됩니다.
[protocol:][//]lvmid[@hostname[:port]/servername]
vmid 캐릭터 라인의 구문의 대부분은, URI 의 구문에 대응하고 있습니다. vmid 는, 로컬 JVM 를 나타내는 단순한 정수로부터, 통신 프로토콜, 포토 번호, 및 다른 구현 고유의 값을 나타내는 복잡한 구조까지, 여러가지로 다릅니다. 자세한 것은,「가상 머신 식별자」를 참조해 주세요.
interval[s|ms]
초 (s) 또는 밀리 세컨드 (ms)중 지정한 단위에서의 샘플링 간격입니다. 디폴트의 단위는 밀리 세컨드입니다.  정의 정수치를 사용할 필요가 있습니다.  지정했을 경우,jstat 는 간격 마다 출력을 생성합니다.
count
표시하는 샘플수입니다. 기정치는 무한합니다. 즉,jstat 는, 타겟 JVM 가 종료될 때까지, 또는 jstat 커멘드가 종료할 때까지, 통계 데이터를 표시합니다. 정의 정수치를 사용할 필요가 있습니다.

설명

jstat 툴은, 설치되어 있는 HotSpot Java 가상 머신 (JVM)의 퍼포먼스 통계 데이터를 표시합니다. 타겟 JVM 는, 가상 머신 식별자, 즉 아래와 같은 vmid 옵션에 의해 식별됩니다.

주: 이 유틸리티는 서포트 대상외이며, 장래의 J2SE SDK 의 버젼에서는 이용할 수 없게 될 가능성이 있습니다. 현재, Windows 98 및 Windows Me 플랫폼에서는 사용할 수 없습니다.

가상 머신 식별자

vmid 캐릭터 라인의 구문의 대부분은, URI 의 구문에 대응하고 있습니다.

[protocol:][//]lvmid[@hostname][:port][/servername]
protocol
통신 프로토콜입니다. protocol 가 생략 되어hostname 가 지정되어 있지 않은 경우, 디폴트의 프로토콜이, 플랫폼 고유의 최적화된 로컬 프로토콜이 됩니다. protocol 가 생략 되어hostname 가 지정되고 있는 경우는, 디폴트 프로토콜은 rmi 가 됩니다.
lvmid
타겟 JVM 의 로컬 가상 머신 식별자입니다. lvmid 는, 시스템상의 JVM 를 일의에 식별하는 플랫폼 고유의 값입니다. lvmid 는, 가상 머신 식별자의 유일한 필수 요소입니다. lvmid 는, 절대라고 하는 것은 아닙니다만, 일반적으로는 타겟 JVM 프로세스에 대한 operating system의 프로세스 식별자입니다. jps 커멘드를 사용해,lvmid 를 지정할 수 있습니다. 또, Unix 플랫폼에서는ps 커멘드를 사용해, Windows 에서는 Windows 태스크 매니저를 사용해,lvmid 를 지정할 수 있습니다.
hostname
타겟 호스트를 나타내는 호스트명 또는 IP 주소입니다. hostname 가 생략 되고 있는 경우는, 타겟 호스트는 로컬 호스트가 됩니다.
port
리모트 서버와 통신하기 위한 디폴트 포토입니다. hostname 가 생략 되고 있는지,protocol 로 최적화된 로컬 프로토콜이 지정되고 있는 경우,port 는 무시됩니다. 그렇지 않으면,port 파라미터의 취급은, 구현에 따라서 다릅니다. 디폴트의 rmi 프로토콜의 경우,port 는, 리모트 호스트상의 rmiregistry 의 포토 번호를 나타냅니다. port 가 생략 되어protocolrmi 가 지정되고 있는 경우, 디폴트의 rmiregistry 포토 (1099)가 사용됩니다.
servername
이 파라미터의 취급은, 구현에 따라서 다릅니다. 최적화된 로컬 프로토콜의 경우, 이 필드는 무시됩니다. rmi 프로토콜의 경우는, 이 파라미터는, 리모트 호스트상의 RMI 자원 오브젝트의 이름을 나타냅니다.

옵션

jstat 커멘드는,일반적인 옵션출력 옵션의 2 개의 타입의 옵션을 서포트하고 있습니다. 일반적인 옵션을 사용했을 경우,jstat 는 간단한 사용율 및 버젼 정보를 표시합니다. 출력 옵션에서는, 통계 데이터 출력의 내용과 형식을 지정합니다.

주: 모든 옵션과 그 기능은, 장래의 릴리스로 변경 또는 폐지될 가능성이 있습니다.

일반적인 옵션

몇개의 일반적인 옵션을 지정했을 경우, 다른 옵션 또는 파라미터는 일절 지정할 수 없습니다.

-help
헬프 메세지를 표시합니다.
-version
버젼 정보를 표시합니다.
-options
통계 데이터 옵션을 일람표 가리킵니다. 아래와 같은「출력 옵션」시에를 참조해 주세요.

출력 옵션

일반적인 옵션을 지정하지 않는 경우에, 출력 옵션을 지정할 수 있습니다. 출력 옵션은,jstat 의 출력의 내용 및 형식을 지정해, 단일의 statOption 와 다른 몇개의 출력 옵션 (-h, -t, 및 -J)으로 구성됩니다.  statOption 는 최초로 기술할 필요가 있습니다.

출력은, 각 열이 공백에서 단락지어진 테이블의 형식으로 구성됩니다. 타이틀을 적은 헤더행에, 각 열의 설명이 기록됩니다.  -h 옵션을 사용해, 헤더를 표시하는 빈도를 설정합니다.  통상, 열의 헤더명은 옵션이 차이가 나는 경우에서도 일관하고 있습니다. 일반적으로, 2 개의 옵션으로 같은 이름의 열이 사용되고 있으면, 2 개의 열의 데이터 소스는 같게 됩니다.

-t 옵션을 사용하면(자),Timestamp 라고 하는 라벨이 붙은 타임 스탬프의 열이, 출력의 최초의 열로서 표시됩니다. Timestamp 열에는, 타겟 JVM 의 기동으로부터의 경과시간이, 초단위로 표시됩니다. 타임 스탬프의 정밀도는, 다양한 요인에 따라서 달라, 대량의 부하가 걸린 시스템에서의 thread 스케줄의 지연에 의해 변동합니다.

intervalcount 파라미터를 사용해,jstat 가 그 출력을 표시하는 빈도와 회수를 각각 지정합니다.

주: 장래의 릴리스로 이 형식은 변경될 가능성이 있기 (위해)때문에,jstat 의 출력을 해석하는 스크립트는 작성하지 않는 것을 추천합니다. jstat 출력을 해석하는 스크립트를 작성하는 경우는, 이 툴의 장래의 릴리스로, 그 스크립트를 변경해야 하는 것에 유의해 주세요.

-statOption
jstat 가 표시하는 통계 데이터 정보를 지정합니다. 다음의 겉(표)에는, 이용 가능한 옵션이 일람표 나타나고 있습니다.  특정의 플랫폼의 인스톨에 대해, 옵션을 일람표시 하려면 , 일반적인 옵션의 -options 를 사용합니다.

옵션 표시 내용
class 클래스 로더의 동작에 관한 통계 데이터
compiler HotSpot Just-in-Time 컴파일러의 동작에 관한 통계 데이터
gc 가베지 컬렉트된 heap의 동작에 관한 통계 데이터
gccapacity 세대마다의 용량과 대응하는 영역에 관한 통계 데이터
gccause 가베지 콜렉션 통계 데이터의 개요 (-gcutil 와 같다)와 직전 및 현재 (적용 가능한 경우)의 가베지 콜렉션 이벤트의 원인
gcnew New 세대의 동작에 관한 통계 데이터
gcnewcapacity New 세대의 사이즈와 대응하는 영역에 관한 통계 데이터
gcold Old 세대 및 Permanent 세대의 동작에 관한 통계 데이터
gcoldcapacity Old 세대의 사이즈에 관한 통계 데이터
gcpermcapacity  Permanent 세대의 사이즈에 관한 통계 데이터
gcutil 가베지 콜렉션 통계 데이터의 개요
printcompilation HotSpot 컴파일 방법의 통계 데이터
-h n
n 샘플 (출력행) 마다 열헤더를 표시. 다만,n 는 정의 정수치. 디폴트치는 0. 이 때, 데이터의 최초의 행 위에 열헤더가 표시된다
-t n
타임 스탬프열을 출력의 최초의 열로서 표시. 타임 스탬프는, 타겟 JVM 의 기동시부터의 경과시간
-J javaOption
javaOptionjava 어플리케이션 기동 툴에 건네준다. 예를 들어,-J-Xms48m 와 지정하면(자), 기동 메모리는 48 M바이트로 설정된다. 옵션의 완전한 리스트에 대해서는, 다음의 문서를 참조

statOption 와 출력

이후의 겉(표)에서는,jstatstatOption 마다 출력하는 열에 대해 개요를 나타냅니다.

-class 옵션

클래스 로더의 통계 데이터
설명
Loaded 로드 된 클래스의 수
Bytes 로드 된 K 바이트수
Unloaded 언로드된 클래스의 수
Bytes 언로드된 K 바이트수
Time 클래스의 로드나 언로드 처리에 필요로 한 시간

-compiler 옵션

HotSpot Just-In-Time 컴파일러의 통계 데이터
설명
Compiled 실행된 컴파일 태스크의 수
Failed 실패한 컴파일 태스크의 수
Invalid 무효로 된 컴파일 태스크의 수
Time 컴파일 태스크의 실행에 필요로 한 시간
FailedType 마지막에 실패한 컴파일의 컴파일 타입
FailedMethod 마지막에 실패한 컴파일의 클래스명과 메소드

-gc 옵션

가베지 컬렉트된 heap의 통계 데이터
설명
S0C Survivor 영역 0 의 현재의 용량 (KB)
S1C Survivor 영역 1 의 현재의 용량 (KB)
S0U Survivor 영역 0 의 사용율 (KB)
S1U Survivor 영역 1 의 사용율 (KB)
EC Eden 영역의 현재의 용량 (KB)
EU Eden 영역의 사용율 (KB)
OC Old 영역의 현재의 용량 (KB)
OU Old 영역의 사용율 (KB)
PC Permanent 영역의 현재의 용량 (KB)
PU Permanent 영역의 사용율 (KB)
YGC Young 세대의 GC 이벤트수
YGCT Young 세대의 가베지 콜렉션 시간
FGC 풀 GC 이벤트수
FGCT 풀 가베지 콜렉션 시간
GCT 가베지 콜렉션의 합계 시간

-gccapacity 옵션

메모리프르 세대 및 영역 용량
설명
NGCMN New 세대의 최소 용량 (KB)
NGCMX New 세대의 최대 용량 (KB)
NGC New 세대의 현재의 용량 (KB)
S0C Survivor 영역 0 의 현재의 용량 (KB)
S1C Survivor 영역 1 의 현재의 용량 (KB)
EC Eden 영역의 현재의 용량 (KB)
OGCMN Old 세대의 최소 용량 (KB)
OGCMX Old 세대의 최대 용량 (KB)
OGC Old 세대의 현재의 용량 (KB)
OC Old 영역의 현재의 용량 (KB)
PGCMN Permanent 세대의 최소 용량 (KB)
PGCMX Permanent 세대의 최대 용량 (KB)
PGC Permanent 세대의 현재의 용량 (KB)
PC Permanent 영역의 현재의 용량 (KB)
YGC Young 세대의 GC 이벤트수
FGC 풀 GC 이벤트수

-gccause 옵션

이 옵션은,-gcutil 옵션과 같은 가베지 콜렉션 통계 데이터의 개요를 표시합니다만, 마지막 가베지 콜렉션 이벤트와 (적용 가능한 경우는) 현재의 가베지 콜렉션 이벤트의 원인이 포함됩니다. -gcutil 로 일람표 나타나는 열 외에, 이 옵션에서는 다음의 열이 추가됩니다.

GC 이벤트를 포함한 가베지 콜렉션 통계 데이터
설명
LGCC 마지막 가베지 콜렉션의 원인
GCC 현재의 가베지 콜렉션의 원인

-gcnew 옵션

New 세대의 통계 데이터
설명
S0C Survivor 영역 0 의 현재의 용량 (KB)
S1C Survivor 영역 1 의 현재의 용량 (KB)
S0U Survivor 영역 0 의 사용율 (KB)
S1U Survivor 영역 1 의 사용율 (KB)
TT 전당 들어가 귀의치
MTT 최대 전당 들어가 귀의치
DSS 적절한 Survivor 사이즈 (KB)
EC Eden 영역의 현재의 용량 (KB)
EU Eden 영역의 사용율 (KB)
YGC Young 세대의 GC 이벤트수
YGCT Young 세대의 가베지 콜렉션 시간

-gcnewcapacity 옵션

New 세대 영역 사이즈의 통계 데이터
설명
NGCMN          
New 세대의 최소 용량 (KB)
NGCMX     New 세대의 최대 용량 (KB)
NGC     New 세대의 현재의 용량 (KB)
S0CMX Survivor 영역 0 의 최대 용량 (KB)
S0C Survivor 영역 0 의 현재의 용량 (KB)
S1CMX Survivor 영역 1 의 최대 용량 (KB)
S1C Survivor 영역 1 의 현재의 용량 (KB)
ECMX Eden 영역의 최대 용량 (KB)
EC Eden 영역의 현재의 용량 (KB)
YGC Young 세대의 GC 이벤트수
FGC 풀 GC 이벤트수

-gcold 옵션

Old 및 Permanent 세대의 통계 데이터
설명
PC Permanent 영역의 현재의 용량 (KB)
PU Permanent 영역의 사용율 (KB)
OC Old 영역의 현재의 용량 (KB)
OU Old 영역의 사용율 (KB)
YGC Young 세대의 GC 이벤트수
FGC 풀 GC 이벤트수
FGCT 풀 가베지 콜렉션 시간
GCT 가베지 콜렉션총시간

-gcoldcapacity 옵션

Old 세대의 통계 데이터
설명
OGCMN Old 세대의 최소 용량 (KB)
OGCMX Old 세대의 최대 용량 (KB)
OGC Old 세대의 현재의 용량 (KB)
OC Old 영역의 현재의 용량 (KB)
YGC Young 세대의 GC 이벤트수
FGC 풀 GC 이벤트수
FGCT 풀 가베지 콜렉션 시간
GCT 가베지 콜렉션총시간

-gcpermcapacity 옵션

Permanent 세대의 통계 데이터
설명
PGCMN Permanent 세대의 최소 용량 (KB)
PGCMX Permanent 세대의 최대 용량 (KB)
PGC Permanent 세대의 현재의 용량 (KB)
PC Permanent 영역의 현재의 용량 (KB)
YGC Young 세대의 GC 이벤트수
FGC 풀 GC 이벤트수
FGCT 풀 가베지 콜렉션 시간
GCT 가베지 콜렉션총시간

-gcutil 옵션

가베지 콜렉션 통계 데이터의 개요
설명
S0 Survivor 영역 0 의 사용율 (현재의 용량에 대한 퍼센티지)
S1 Survivor 영역 1 의 사용율 (현재의 용량에 대한 퍼센티지)
E Eden 영역의 사용율 (현재의 용량에 대한 퍼센티지)
O Old 영역의 사용율 (현재의 용량에 대한 퍼센티지)
P Permanent 영역의 사용율 (현재의 용량에 대한 퍼센티지)
YGC Young 세대의 GC 이벤트수
YGCT Young 세대의 가베지 콜렉션 시간
FGC 풀 GC 이벤트수
FGCT 풀 가베지 콜렉션 시간
GCT 가베지 콜렉션총시간

-printcompilation 옵션

HotSpot 컴파일 방법의 통계 데이터
설명
Compiled 실행된 컴파일 태스크의 수
Size 메소드의 바이트 코드의 바이트수
Type 컴파일 타입
Method 컴파일 방법을 특정하는 클래스명과 메소드명. 클래스명에서는, 이름 공간의 단락 문자로서 「.」(은)는 아니고 「/」이 사용된다. 메소드명은, 지정된 클래스내의 메소드이다. 이러한 2 개의 필드의 형식은, HotSpot - XX:+PrintComplation 옵션과 대응하고 있다

이 항에서는, 21891 의 lvmid 를 가지는 로컬 JVM 를 감시하는 예를 나타냅니다.

gcutil 옵션의 사용

이 예는,lvmid 21891 에 접속해, 250 밀리 세컨드 간격으로 7 개의 샘플을 취득해,-gcutil 옵션에서의 지정에 따라 출력을 표시합니다.

jstat -gcutil 21891 250 7
S0 S1 E O P YGC YGCT FGC FGCT GCT
12.44 0.00 27.20 9.49 96.70 78 0.176 5 0.495 0.672
12.44 0.00 62.16 9.49 96.70 78 0.176 5 0.495 0.672
12.44 0.00 83.97 9.49 96.70 78 0.176 5 0.495 0.672
0.00 7.74 0.00 9.51 96.70 79 0.177 5 0.495 0.673
0.00 7.74 23.37 9.51 96.70 79 0.177 5 0.495 0.673
0.00 7.74 43.82 9.51 96.70 79 0.177 5 0.495 0.673
0.00 7.74 58.11 9.51 96.71 79 0.177 5 0.495 0.673

이 예의 출력은, Young 세대의 콜렉션이 3 번째와 4 번째의 샘플간에 행해진 것을 나타내고 있습니다. 콜렉션에는 0.001 초 걸리고 있어 오브젝트가 Eden 영역 (E)으로부터 Old 영역 (O)에 승격했기 때문에, Old 영역의 사용율은 9.49% 에서 9.51% 에 증가하고 있습니다. Survivor 영역은, 콜렉션전은 12.44% 가 사용되고 있었습니다만, 콜렉션 후는 7.74% 밖에 사용되고 있지 않습니다.

열헤더 캐릭터 라인의 반복

이 예는,lvmid 21891 에 접속해, 250 밀리 세컨드 간격으로 샘플을 취득해,-gcutil 옵션에서의 지정에 따라 출력을 표시합니다. 게다가-h3 옵션을 사용해, 데이터가 3 행 표시될 때 마다 열헤더를 출력합니다.

jstat -gcnew -h3 21891 250
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
64.0 64.0 0.0 31.7 31 31 32.0 512.0 178.6 249 0.203
64.0 64.0 0.0 31.7 31 31 32.0 512.0 355.5 249 0.203
64.0 64.0 35.4 0.0 2 31 32.0 512.0 21.9 250 0.204
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
64.0 64.0 35.4 0.0 2 31 32.0 512.0 245.9 250 0.204
64.0 64.0 35.4 0.0 2 31 32.0 512.0 421.1 250 0.204
64.0 64.0 0.0 19.0 31 31 32.0 512.0 84.4 251 0.204
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
64.0 64.0 0.0 19.0 31 31 32.0 512.0 306.7 251 0.204

이 예에서는, 헤더 캐릭터 라인의 반복을 볼 수 있는 것 외에도, 2 번째와 3 번째의 샘플간에 Young GC 를 한 것을 알 수 있습니다. 이 계속 시간은 0.001 초였습니다. 이 콜렉션에서는, Survivor 영역 0 의 사용율 (S0U)이 적절한 Survivor 사이즈 (DSS)를 초과하게 되는 라이브 데이터가 검출되었습니다. 이 결과, 오브젝트는, Old 세대 (이 출력에는 비표시)에 승격되어 전당 들어가 귀의치 (TT)가, 31 에서 2 에 격하되었습니다.

다른 콜렉션이, 5 번째와 6 번째의 샘플간에 행해지고 있습니다. 이 콜렉션에서는, Survivor 를 거의 보지 못하고, 전당 들어가 귀의치를 31 에 되돌렸습니다.

샘플마다의 타임 스탬프의 삽입

이 예는,lvmid 21891 에 접속해, 250 밀리 세컨드 간격으로 3 개의 샘플을 취득하고 있습니다. -t 옵션을 사용해, 최초의 열에 샘플마다의 타임 스탬프를 표시하고 있습니다.

jstat -gcoldcapacity -t 21891 250 3
Timestamp OGCMN OGCMX OGC OC YGC FGC FGCT GCT
150.1 1408.0 60544.0 11696.0 11696.0 194 80 2.874 3.799
150.4 1408.0 60544.0 13820.0 13820.0 194 81 2.938 3.863
150.7 1408.0 60544.0 13820.0 13820.0 194 81 2.938 3.863

Timestamp 열에는, 타겟 JVM 의 기동시부터의 경과시간이, 초단위로 리포트되고 있습니다. 게다가-gcoldcapacity 출력으로는, 할당 요구 또는 승격 요구 혹은 그 양쪽 모두를 채우기 위해서(때문에) heap가 확장할 때 마다, Old 세대의 용량 (OGC)과 Old 영역의 용량 (OC)이 증가하고 있는 것을 알 수 있습니다. Old 세대의 용량 (OGC)은, 81 번째의 풀 GC (FGC) 후에, 11696 KB 에서 13820 KB 에 증가하고 있습니다. Old 세대 ( 및 영역)의 최대 용량은, 60544 KB (OGCMX)이므로, 아직 확장할 수 있을 여유가 남아 있습니다.

리모트 JVM 의 인스트르멘테이션의 감시

이 예는,-gcutil 옵션을 사용해,remote.domain 라고 하는 시스템상의 lvmid 40496 에 접속해, 샘플을 초단위로 무기한으로 취득하고 있습니다.

jstat -gcutil 40496@remote.domain 1000
... output omitted

lvmid 는, 리모트 호스트의 이름과 결합되어,40496@remote.domainvmid 를 구성해 있습니다. 결과적으로, 이 vmid 는,rmi 프로토콜을 사용해, 리모트 호스트상의 디폴트의 jstatd 서버와 통신합니다. jstatd 서버는,rmiregistry 를 사용해, 디폴트의 rmiregistry 포토 (포토 1099)에 바인드 된 remote.domain 에 배치.

관련 항목

728x90

'백엔드 > Java' 카테고리의 다른 글

Spring @Autowired 사용시 주의점  (0) 2019.03.11
Spring + Mybatis + Junit 단위 테스트  (0) 2017.09.06
PowerMockup  (0) 2013.10.09
인터페이스 활용  (1) 2013.03.06
자바 JVM 옵션 리스트  (1) 2009.07.01
자바 template engine 프리마커  (1) 2009.06.20
자바 윈도우 환경설정  (0) 2009.06.14
Eclipse 3.5 Galileo 6월 24일 릴리즈  (0) 2009.06.13

댓글