Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
JVM
パフォーマンスチューニング
基礎
2013/12/14
せとあずさ♂
•
•
•
•
•
•
•
•
•

@setoazusa
http://blog.fieldnotes.jp/
#tddbc 横浜(2011~2013)
#java_ja
#yokohamarb
とはいえ、メインはJava
最近、MacからW...
おことわり
• 今日は「JVMパフォーマンスチューニン
グ基礎」というお題ですが...
– →HotSpot VMに限定した話になります
m(__)m
アジェンダ
•
•
•
•

パフォーマンスチューニングの原則
ツールあれこれ(小ネタ)
サーバーVMとクライアントVM
エルゴノミクス
パフォーマンスチューニングの原
則
• 測定する
測定に使用するツール
• サーバー側
– VisualVM
– jstat
– sysstat / vmstat
– SQLのログ(呼び出し回数、スロークエリー)

• クライアント側
– Jmeter
– ab
– gatling
(小ネタ)visualvmでリモートサー
バーのヒープの状態を監視する。
• こんな感じのpolicyファイルを書いて、
grant codebase "file:${java.home}/../lib/tools.jar" {
permiss...
後はVisualVMでリモートホストを追加すればOK。
(小ネタ)jstatの出力にタイムスア
ンプをつける
p=`ps aux |grep tomcat |grep うにゃう
にゃ|grep java |awk '{print $2}'`; jstat
-gcutil -h10 $p 10000 ...
クライアントVMとサーバーVM
• クライアントVM
– 起動時間を短縮し、メモリサイズを縮小する
ように調整されています。

• サーバーVM
– プログラム実行速度が最大になるように設計
されています。
• 64bitのHotSportVMには、サーバーVMし
か呼び出しオプションがありません。
(-clientを指定してもサーバVMが起動し
ます)
• じゃあ、サーバーVMしか実装がいないの
かというと、そうではなくて...
• サーバーVMで、起動時のオーバーヘッド
を短縮する方法→階層型コンパイル
– JDK7u1 JDK6u25 から導入
– 最初はクライアントVMでコンパイルして、呼
び出し回数に応じてサーバーVMに切り替える
– -XX:+TieredCo...
• 例:Tomcatの起動時間
Tomcat7.0.47 JDK7u45(64bit)
– 指定なし
→ 1510ms

– -XX:+TieredCompilation XX:TieredStopAtLevel=1

→602ms

• 更に...
サーバーVMとクライアントVMの
違い
• ヒープ容量を指定しなかった場合のデ
フォルト値
– クライアントVM→64MB
– サーバーVM→ 物理メモリーの 1/4 か、1GB
かの小さい方。
• また、パフォーマンス関係のパラメーターは、統...
• じゃあ、エルゴノミクス任せにすればい
いのかというと...
(おさらい)世代別GC
Old→2.6GB

Eden→1.3GB

S0→450MB

S1→450MB
Let’sチューニング
• ヒープのパラメーターを調整
• ただし、細かい値の設定はエルゴノミク
スに任せる
-Xms ...ヒープの初期容量
-Xmx ...ヒープの最大容量
-XX:NewSize ... new領域のサイズ
-XX:NewRatio new領域とold領域の比率
-XX:SurvivorRatio ...EdenとSurvivor...
• フルGCの発生をどれだけ回避するかが鍵。
– 但し、ライフサイクルの長いオブジェクトの
存在や、定期フルGCのこともあるので、フル
GCを起こさないチューニングというのは非現
実的
• CPUのリソースを潤沢に使えるなら、コ
ンカレントGCの使用も手でしょう。
• 但し、従前のGCとコンカレントGCでは
GC関連のデフォルトパラメーターが異な
るので、そこには注意。
さらに注意しなければならないのは、コンカレントGCオプション
「-XX:+UseConcMarkSweepGC」を使用した場合、New世代領
域の オプションデフォルト値が「-XX:SurvivorRatio=1024 XX:MaxTenuri...
(小ネタ)mod_proxy_ajpの落とし
穴
(小ネタ)ヒープリークの調査方法
• ストレスツールを使って、一定の負荷を
かけながら、定期的にヒープの統計情報
を取得する

• http://qiita.com/setoazusa/items/ee0
a7d795c2687b80817
Upcoming SlideShare
Loading in …5
×

Javaパフォーマンスチューニング基礎

6,381 views

Published on

  • Follow the link, new dating source: ❶❶❶ http://bit.ly/2ZDZFYj ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating for everyone is here: ❤❤❤ http://bit.ly/2ZDZFYj ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Javaパフォーマンスチューニング基礎

  1. 1. JVM パフォーマンスチューニング 基礎 2013/12/14 せとあずさ♂
  2. 2. • • • • • • • • • @setoazusa http://blog.fieldnotes.jp/ #tddbc 横浜(2011~2013) #java_ja #yokohamarb とはいえ、メインはJava 最近、MacからWindows8に乗り換えました チャンキヨかわいいよチャンキヨ miwaは自慢の妹です
  3. 3. おことわり • 今日は「JVMパフォーマンスチューニン グ基礎」というお題ですが... – →HotSpot VMに限定した話になります m(__)m
  4. 4. アジェンダ • • • • パフォーマンスチューニングの原則 ツールあれこれ(小ネタ) サーバーVMとクライアントVM エルゴノミクス
  5. 5. パフォーマンスチューニングの原 則 • 測定する
  6. 6. 測定に使用するツール • サーバー側 – VisualVM – jstat – sysstat / vmstat – SQLのログ(呼び出し回数、スロークエリー) • クライアント側 – Jmeter – ab – gatling
  7. 7. (小ネタ)visualvmでリモートサー バーのヒープの状態を監視する。 • こんな感じのpolicyファイルを書いて、 grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; }; • jstatdを起動します。 C:¥usr>jstatd.exe -J-Djava.security.policy=jstatd.al l.policy -J-Djava.rmi.server.hostname=192.168.0.4
  8. 8. 後はVisualVMでリモートホストを追加すればOK。
  9. 9. (小ネタ)jstatの出力にタイムスア ンプをつける p=`ps aux |grep tomcat |grep うにゃう にゃ|grep java |awk '{print $2}'`; jstat -gcutil -h10 $p 10000 | awk '{print strftime("%H:%M:%S"), $0}' >>jstat.log
  10. 10. クライアントVMとサーバーVM • クライアントVM – 起動時間を短縮し、メモリサイズを縮小する ように調整されています。 • サーバーVM – プログラム実行速度が最大になるように設計 されています。
  11. 11. • 64bitのHotSportVMには、サーバーVMし か呼び出しオプションがありません。 (-clientを指定してもサーバVMが起動し ます) • じゃあ、サーバーVMしか実装がいないの かというと、そうではなくて...
  12. 12. • サーバーVMで、起動時のオーバーヘッド を短縮する方法→階層型コンパイル – JDK7u1 JDK6u25 から導入 – 最初はクライアントVMでコンパイルして、呼 び出し回数に応じてサーバーVMに切り替える – -XX:+TieredCompilation XX:TieredStopAtLevel=1
  13. 13. • 例:Tomcatの起動時間 Tomcat7.0.47 JDK7u45(64bit) – 指定なし → 1510ms – -XX:+TieredCompilation XX:TieredStopAtLevel=1 →602ms • 更に、バイトコードの検証をスキップする と... – -XX:+TieredCompilation XX:TieredStopAtLevel=1 -Xverify:none →556ms
  14. 14. サーバーVMとクライアントVMの 違い • ヒープ容量を指定しなかった場合のデ フォルト値 – クライアントVM→64MB – サーバーVM→ 物理メモリーの 1/4 か、1GB かの小さい方。 • また、パフォーマンス関係のパラメーターは、統 計情報に応じて、動的に変化します。(エルゴノミ クス)
  15. 15. • じゃあ、エルゴノミクス任せにすればい いのかというと...
  16. 16. (おさらい)世代別GC
  17. 17. Old→2.6GB Eden→1.3GB S0→450MB S1→450MB
  18. 18. Let’sチューニング • ヒープのパラメーターを調整 • ただし、細かい値の設定はエルゴノミク スに任せる
  19. 19. -Xms ...ヒープの初期容量 -Xmx ...ヒープの最大容量 -XX:NewSize ... new領域のサイズ -XX:NewRatio new領域とold領域の比率 -XX:SurvivorRatio ...EdenとSurvivorの比 率 • -XX:targetSurvivorRatio ... Survivorが一 杯になったと判定される閾値 • -XX:maxTenuringThreshold ... new領域か らold領域に移動する閾値 • • • • •
  20. 20. • フルGCの発生をどれだけ回避するかが鍵。 – 但し、ライフサイクルの長いオブジェクトの 存在や、定期フルGCのこともあるので、フル GCを起こさないチューニングというのは非現 実的
  21. 21. • CPUのリソースを潤沢に使えるなら、コ ンカレントGCの使用も手でしょう。 • 但し、従前のGCとコンカレントGCでは GC関連のデフォルトパラメーターが異な るので、そこには注意。
  22. 22. さらに注意しなければならないのは、コンカレントGCオプション 「-XX:+UseConcMarkSweepGC」を使用した場合、New世代領 域の オプションデフォルト値が「-XX:SurvivorRatio=1024 XX:MaxTenuringThreshold=0」に自動設定されるという点です。 http://wallclimb.com/2009/10/12/%E3%82%B3%E3%83%B3%E3%8 2%AB%E3%83%AC%E3%83%B3%E3%83%88gc%E3%81 %AE%E6%B3%A8%E6%84%8F%E7%82%B9/ →この記述自体は obsoleted • jdk7u45の場合、 MaxTenuringThreshold がコ ンカンレントGCの場合は8(通常は15)
  23. 23. (小ネタ)mod_proxy_ajpの落とし 穴
  24. 24. (小ネタ)ヒープリークの調査方法 • ストレスツールを使って、一定の負荷を かけながら、定期的にヒープの統計情報 を取得する • http://qiita.com/setoazusa/items/ee0 a7d795c2687b80817

×