JVM が使うメモリ
- Java ヒープメモリ
- Cヒープ
- スレッドスタック
といった種類がある。一般に言われるヒープは Java ヒープメモリのことを言う。-Xmx
などで設定されるヒープは Java ヒープメモリのみの話なので、JVM プロセスが使うメモリ総量は -Xmx
で指定したメモリサイズを超える点に注意
ガベージコレクション
G1GC
ガベージファーストガベレージコレクション。Java9 からのデフォルト方式(スペックが低いとそうとは限らないと言う話も)。
jstat で JVM のパフォーマンス統計を見る
次のコマンドで java のプロセスIDを確認します。
jps
次のコマンドで各領域の容量と使用量を確認できます。
jstat -gc [プロセスID]
次のコマンドで1秒ごとに各領域の使用率を確認できます。-h5
は5行ごとにヘッダを表示するオプションです。
jstat -gcutil -h5 [プロセスID] 1000
JVM のヒープメモリ設定
JVM の起動時に -Xmx
, -Xms
などのオプションで指定する。-Xmx
は -XX:MaxHeapSize
と同じ。
デフォルト値
デフォルト値は使用可能なサーバの物理メモリに依存する。16GB の環境ならその1/4の 4GB がデフォルトの最大ヒープサイズになる。
jconsole
起動するには jconsole とコマンドを打つだけ。
jconsole
踏み台を経由してリモートアクセスするには SOCKS プロキシを使う
設定
CATALINA_OPTS
に下記の設定を追加する
-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=7085 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
Reference
- 恐怖の JVM 大量メモリ消費!メモリリークの謎を追え!!
- ヒープ、パーマネント、スタックのメモリがあまり消費されていないにもかかわらず、大量のメモリが消費されていることから JDBC のメモリリークを特定。メモリダンプを取得して文字列の頻度から原因を推定している。
- JVMのヒープメモリを確認する(jstat)
- jstat コマンドでメモリ情報を取得する例。プロセスIDを取得して jstat を実行するというのが基本の流れっぽい。出力された情報の読み方がわからない…
- jstat – Java 仮想マシン統計データ監視ツール
- jstat で出力される内容についての公式ドキュメント
- Javaのメモリ管理(ヒープ・GC)を理解する
- ヒープ領域に対してガベレージコレクションが何をやってくれているかを解説した記事。新しいものを保存する領域から古いものを保存する領域にデータが移っていくというイメージが掴める
- Java開発の性能改善! その3 ヒープダンプを取ろう
- MemoryAnalyzer を使ってヒープダンプの中身を見る記事。連載になっていて順にメモリ解析を行う様子がわかる