気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Javaメモリ関連のTips

1.eclipse.iniファイルの設定値(vmパラメータのみ)

メモリ設定方法

  • vmargs
  • server
  • Dosgi.requiredJavaVersion=1.5
  • Dhelp.lucene.tokenizer=standard
  • Xms1024m
  • Xmx1024m
  • XX:PermSize=256m
  • XX:MaxPermSize=256m
  • XX:NewRatio=2
  • XX:SurvivorRatio=8
  • XX:+UseParNewGC
  • XX:+UseConcMarkSweepGC
  • XX:ParallelGCThreads=30
  • XX:+PrintGCDetails

2.設定パラメータの説明

性能改善パラメータ

  • Xms ヒープ領域(New領域+Old領域)の初期値
  • Xmx ヒープ領域(New領域+Old領域)の最大値
  • XX:PermSize Permanent領域の初期値 MaxPermSizeと同じに設定することが推奨されている
  • XX:MaxPermSize Permanent領域の最大値
  • XX:NewRatio New領域 と Old領域 の比率

例) -XX:NewRatio=2
New領域 : Old領域 = 1 : 2

  • XX:SurvivorRatio New領域 と Old領域 の比率

例) -XX:SurvivorRatio=8
Eden領域 : From領域 : To領域 = 8 : 1 : 1

GC関連パラメータ

  • XX:+UseLargePages
  • XX:+UseParNewGC
  • XX:+UseConcMarkSweepGC
  • XX:ParallelGCThreads=4
  • XX:+PrintGCDetails
  • XX:+UseParNewGC New領域では、GCをマルチスレッドで実行する。Old領域が不足したら、Full GCをシングルスレッドで実行する
  • XX:+UseConcMarkSweepGC アプリケーションスレッドと並列してGCを行うことで、システム停止時間を減らす
  • XX:ParallelGCThreads 使用可能なプロセッサー・コアの数と同じにする。クワッド・コア・プロセッサーは4
  • XX:+PrintGCDetails New世代領域、Old 世代領域それぞれについてのオブジェクト量の変化情報を表示

3.javaが確保できるメモリサイズの確認方法

java -Xmx1500m -version

(1.5GB確保できるか?)
Windows 32bit版Javaの設定可能なヒープサイズは1.5GB前後

4.VMの起動モード

・クライアントVMモード
起動時間を短縮し、メモリサイズを縮小するように調整されている。
VM起動時に「-client」オプションを付けて実行する。

・サーバVMモード
プログラム実行速度が最大になるように設計されている。
VM起動時に「-server」オプションを付けて実行する。

4.1起動モードの確認方法

$java -version

$java -Xmx1024m -version
java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b26)
Java HotSpot(TM) Client VM (build 25.40-b25, mixed mode)
↑クライアントVMモード

JVMのチューニング方法
http://d.hatena.ne.jp/ogin_s57/20120709/1341836704

5.ヒープ、GC状況確認

5.1 確認用コマンド

【jstat】
JDKにデフォルトで同梱されているコマンド。

  • gcutilオプションで、From(S0)、To(S1)、Eden、Old、Permanent領域ごとの使用率やマイナーGC、Full GCの発生回数、GCの実行時間累計が確認可能。

すでに起動中のJavaプロセス(jpsコマンドで取得)のヒープの使用状況をリアルタイムに確認することができる。
(例)jstat -gcutil -h10 5000
(例)jstat -gcutil -t 10s 10秒おきに表示

5.2 監視対象とするJVMのプロセスIDの確認方法

jps

$ jps
6008
7412 Jps
7440 Bootstrap

jpsのPIDは常に変わる場合があり、6008(筆はeclipseのPIDを指定)が監視対象
javaについてはjpsよりタスクマネージャのPIDを見ると良いかも。
(PIDの表示は「表示」→「列の選択」で表示)

※コマンド実行できない場合は起動対象のjavaのbinへパスを通す

5.3 ログの見方

ガベージコレクション統計データの概要
列 説明
S0 Survivor 領域 0 の使用率 (現在の容量に対するパーセンテージ)
S1 Survivor 領域 1 の使用率 (現在の容量に対するパーセンテージ)
E Eden 領域の使用率 (現在の容量に対するパーセンテージ)
O Old 領域の使用率 (現在の容量に対するパーセンテージ)
P Permanent 領域の使用率 (現在の容量に対するパーセンテージ)
YGC 若い世代の GC イベント数
YGCT 若い世代のガベージコレクション時間
FGC フル GC イベント数
FGCT フルガベージコレクション時間
GCT ガベージコレクション総時間

6. メモリ状況確認(ダンプ取得)

スレッドダンプ取得
jstack -F 9352 > threaddump.txt

ヒープダンプ取得
jmap -F -dump:format=b,file=C:\Users\AAA\Desktop\heapdump.map 3068

メモリリーク(メモリ解放漏れ)をチェック


7.参考URL

GCを適切に行わせるためのヒープサイズの設定
http://www.atmarkit.co.jp/ait/articles/0404/02/news079_2.html

JVMオプション
http://fomsan.sakura.ne.jp/memo/java/javaVMOptions.html

実行中のJavaアプリケーションの拡張設定を確認/変更する
http://d.hatena.ne.jp/Kazuhira/20120623/1340464983

恐怖の JVM 大量メモリ消費!メモリリークの謎を追え!!
http://developer.cybozu.co.jp/tech/?p=8218