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