====== 40 Java Heap Memory確認 ======
jsp, jstatはava-1.8.0-openjdk-devel を入れれば入る。
ava-1.8.0-openjdk-devel
===== jstatの説明 =====
^列^説明^
|S0|Survivor領域0(From)の使用率(現在の容量に対するパーセンテージ)|
|S1|Survivor領域1(To)の使用率(現在の容量に対するパーセンテージ)|
|E|Eden領域の使用率(現在の容量に対するパーセンテージ)|
|O|Old領域の使用率(現在の容量に対するパーセンテージ)|
|P|Permanent領域の使用率(現在の容量に対するパーセンテージ)|
|YGC|New領域のカベージ・コレクションの回数|
|YGCT|New領域のガベージ・コレクション時間(ミリ秒)|
|FGC|完全カベージ・コレクションの回数|
|FGCT|完全ガベージ・コレクション時間|
|GCT|ガベージ・コレクション総時間(ミリ秒)|
===== 見やすくするシェル =====
[[http://luozengbin.github.io/blog/2015-08-30-%5Bjava%E9%81%93%E5%85%B7%5Djstat--gc%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%E8%A6%8B%E3%82%84%E3%81%99%E3%81%8F%E3%81%99%E3%82%8B.html|こちらの人のシェル]]がめちゃくちゃ分かりやすくて感謝
#!/bin/sh
detected_javahome()
{
_PID=$1
JAVA_PATH=$(readlink -f `ps -o cmd= ${_PID} | awk '{print $1}'`) || {
echo "JAVA_HOME 特定出来ませんでした。"
exit 1
}
echo "`dirname "${JAVA_PATH}"`" | sed -e "s|/jre/bin|/bin|g"
}
java_version()
{
"${1}/java" -version 2>&1 | grep version | awk -F'"' '{print $2}' | awk -F'.' '{print $2}'
}
print_gcstat () {
_PID=$1
java_home="`detected_javahome ${_PID}`"
jstat_path="${java_home}/jstat"
if [ -e "${jstat_path}" ]; then
java_ver=`java_version "${java_home}"`
if [ ${java_ver} -gt 7 ]; then
"${jstat_path}" -gc ${_PID} | tail -1 | awk \
'{ \
printf "---------------------------------------------\n"; \
printf "S0 領域 | %7.2f / %7.2f (MB) | %5.2f%% \n" , $3/1024, $1/1024, ($3/$1 * 100); \
printf "S1 領域 | %7.2f / %7.2f (MB) | %5.2f%% \n" , $4/1024, $2/1024, ($4/$2 * 100); \
printf "Eden領域 | %7.2f / %7.2f (MB) | %5.2f%% \n" , $6/1024, $5/1024, ($6/$5 * 100); \
printf "Old 領域 | %7.2f / %7.2f (MB) | %5.2f%% \n" , $8/1024, $7/1024, ($8/$7 * 100); \
printf "Meta領域 | %7.2f / %7.2f (MB) | %5.2f%% \n" , $10/1024, $9/1024, ($10/$9 * 100); \
printf "CCPS領域 | %7.2f / %7.2f (MB) | %5.2f%% \n" , $12/1024, $1/1024, ($12/$11 * 100); \
printf "---------------------------------------------\n"; \
printf "YGC 回数 | %7d 回\n" , $13; \
printf "YGC 時間 | %7.2f 秒\n" , $14; \
printf "FGC 回数 | %7d 回\n" , $15; \
printf "FGC 時間 | %7.2f 秒\n" , $16; \
printf "---------------------------------------------\n"; \
}'
else
"${jstat_path}" -gc $1 | tail -1 | awk \
'{ \
printf "---------------------------------------------\n"; \
printf "S0 領域 | %7.2f / %7.2f (MB) | %5.2f%% \n" , $3/1024, $1/1024, ($3/$1 * 100); \
printf "S1 領域 | %7.2f / %7.2f (MB) | %5.2f%% \n" , $4/1024, $2/1024, ($4/$2 * 100); \
printf "Eden領域 | %7.2f / %7.2f (MB) | %5.2f%% \n" , $6/1024, $5/1024, ($6/$5 * 100); \
printf "Old 領域 | %7.2f / %7.2f (MB) | %5.2f%% \n" , $8/1024, $7/1024, ($8/$7 * 100); \
printf "Perm領域 | %7.2f / %7.2f (MB) | %5.2f%% \n" , $10/1024, $9/1024, ($10/$9 * 100); \
printf "---------------------------------------------\n"; \
printf "YGC 回数 | %7d 回\n" , $11; \
printf "YGC 時間 | %7.2f 秒\n" , $12; \
printf "FGC 回数 | %7d 回\n" , $13; \
printf "FGC 時間 | %7.2f 秒\n" , $14; \
printf "---------------------------------------------\n"; \
}'
fi
fi
}
PID=$1
ps ${PID} | grep [j]ava > /dev/null || {
_PID=`ps -o uid=,pid=,cmd= -C java | head -1 | awk '{print $2}'`
echo "---------------------------------------------"
ps -o uid,pid,cmd -C java
echo "---------------------------------------------"
echo -n "Please input the java process id (${_PID}): "
read PID
if [ -z "${PID}" ]; then
PID=${_PID}
fi
}
ps ${PID} | grep [j]ava > /dev/null && {
print_gcstat ${PID}
}
表示
---------------------------------------------
Please input the java process id (6291):
---------------------------------------------
S0 領域 | 0.00 / 112.00 (MB) | 0.00%
S1 領域 | 76.27 / 76.50 (MB) | 99.70%
Eden領域 | 174.78 / 2515.00 (MB) | 6.95%
Old 領域 | 2657.75 / 5461.50 (MB) | 48.66%
Meta領域 | 113.98 / 117.71 (MB) | 96.83%
CCPS領域 | 10.18 / 112.00 (MB) | 92.55%
---------------------------------------------
YGC 回数 | 206924 回
YGC 時間 | 41329.75 秒
FGC 回数 | 220 回
FGC 時間 | 495.27 秒
---------------------------------------------
{{tag>java}}