SlideShare a Scribd company logo
JVM
パフォーマンスチューニング
基礎
2013/12/14
せとあずさ♂
•
•
•
•
•
•
•
•
•

@setoazusa
http://blog.fieldnotes.jp/
#tddbc 横浜(2011~2013)
#java_ja
#yokohamarb
とはいえ、メインはJava
最近、MacからWindows8に乗り換えました
チャンキヨかわいいよチャンキヨ
miwaは自慢の妹です
おことわり
• 今日は「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" {
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
後はVisualVMでリモートホストを追加すればOK。
(小ネタ)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
クライアントVMとサーバーVM
• クライアントVM
– 起動時間を短縮し、メモリサイズを縮小する
ように調整されています。

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

– -XX:+TieredCompilation XX:TieredStopAtLevel=1

→602ms

• 更に、バイトコードの検証をスキップする
と...
– -XX:+TieredCompilation XX:TieredStopAtLevel=1 -Xverify:none
→556ms
サーバー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の比
率
• -XX:targetSurvivorRatio ... Survivorが一
杯になったと判定される閾値
• -XX:maxTenuringThreshold ... new領域か
らold領域に移動する閾値
•
•
•
•
•
• フルGCの発生をどれだけ回避するかが鍵。
– 但し、ライフサイクルの長いオブジェクトの
存在や、定期フルGCのこともあるので、フル
GCを起こさないチューニングというのは非現
実的
• CPUのリソースを潤沢に使えるなら、コ
ンカレントGCの使用も手でしょう。
• 但し、従前のGCとコンカレントGCでは
GC関連のデフォルトパラメーターが異な
るので、そこには注意。
さらに注意しなければならないのは、コンカレント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)
(小ネタ)mod_proxy_ajpの落とし
穴
(小ネタ)ヒープリークの調査方法
• ストレスツールを使って、一定の負荷を
かけながら、定期的にヒープの統計情報
を取得する

• http://qiita.com/setoazusa/items/ee0
a7d795c2687b80817

More Related Content

PPT
2012年javaメモリリーク
PDF
Javaアプリケーションサーバ 構築・運用の勘所
PDF
20140128 tel@cafe selenium編
PDF
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
PDF
JenkinsとjMeterで負荷テストの自動化
PDF
GUI自動テストの保守性を高めるには
PPTX
Stac2014 石川
PDF
継続的デリバリー読書会 第 7 章 コミットステージ
2012年javaメモリリーク
Javaアプリケーションサーバ 構築・運用の勘所
20140128 tel@cafe selenium編
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
JenkinsとjMeterで負荷テストの自動化
GUI自動テストの保守性を高めるには
Stac2014 石川
継続的デリバリー読書会 第 7 章 コミットステージ

What's hot (20)

KEY
Play with Playframework
PPTX
ノンプログラマのためのSelenium de DDTはじめの一歩
PDF
Stac2013 opening-koukai
 
PDF
JavaOne2013報告会 JavaFX Update
PDF
OSSのブラウザ自動テストツール「Selenium」を使った、開発・テストの効率化
PDF
Awsで実現するseleniumテスト高速術
PDF
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
PDF
Jmeter20120421
PDF
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
PPTX
EMTEを使って自動化の費用対効果をわかりやすく表現する
PDF
Azureを使って手軽にブラウザテストの自動化をはじめよう
PDF
大規模な負荷でもドキドキしない為のJava EE
PDF
デプロイメントパイプラインって何?
PDF
4時間で学ぶ、効率的な自動テストスクリプトのメンテナンス
PPTX
reg-suitとQA Wolfを活用したVisual Regression Test
PPTX
システムテスト自動化標準ガイド 5章発表資料
PDF
20160215 04 java ee7徹底入門 jbatch
PPTX
20131201 テスト自動化カンファレンスLT「激しいUI変更との戦い」
PDF
JobStreamerではじめるJavaBatchのクラウド分散実行
PDF
事例から見るテスト自動化のポイント
Play with Playframework
ノンプログラマのためのSelenium de DDTはじめの一歩
Stac2013 opening-koukai
 
JavaOne2013報告会 JavaFX Update
OSSのブラウザ自動テストツール「Selenium」を使った、開発・テストの効率化
Awsで実現するseleniumテスト高速術
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
Jmeter20120421
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
EMTEを使って自動化の費用対効果をわかりやすく表現する
Azureを使って手軽にブラウザテストの自動化をはじめよう
大規模な負荷でもドキドキしない為のJava EE
デプロイメントパイプラインって何?
4時間で学ぶ、効率的な自動テストスクリプトのメンテナンス
reg-suitとQA Wolfを活用したVisual Regression Test
システムテスト自動化標準ガイド 5章発表資料
20160215 04 java ee7徹底入門 jbatch
20131201 テスト自動化カンファレンスLT「激しいUI変更との戦い」
JobStreamerではじめるJavaBatchのクラウド分散実行
事例から見るテスト自動化のポイント
Ad

Similar to Javaパフォーマンスチューニング基礎 (20)

PDF
運用に効く!JVMオプション三選
PDF
HeapStats: Introduction and Technical Preview
PDF
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure
PPTX
Cloud Native Application on DEIS by using 12 factor
PDF
Osc2013 spring OpenStackで実現する分散ストレージ「Swift」とプライベートクラウド
PDF
Javaで1から10まで書いた話(sanitized)
PDF
Eight meets AWS
PPTX
20161129_npstudy_JunosAutomation
PPTX
Java EE パフォーマンスTips #glassfish_jp
PPTX
HeapStatsのデモ (Java The Night)
PPTX
Introduction to GraalVM and Native Image
PDF
JJUG CCC 2017 Spring LT about JPA
PDF
Asakusa バッチの運用を支える技術
PDF
JVMの中身を可視化してみた
PPTX
ななめ45°から見たJavaOne
PDF
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
PDF
Mbed2013
PDF
Data Engineering at VOYAGE GROUP #jawsdays
PDF
Data Engineering at VOYAGE GROUP #jawsdays
PPTX
Lt talk 2017_0912
運用に効く!JVMオプション三選
HeapStats: Introduction and Technical Preview
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure
Cloud Native Application on DEIS by using 12 factor
Osc2013 spring OpenStackで実現する分散ストレージ「Swift」とプライベートクラウド
Javaで1から10まで書いた話(sanitized)
Eight meets AWS
20161129_npstudy_JunosAutomation
Java EE パフォーマンスTips #glassfish_jp
HeapStatsのデモ (Java The Night)
Introduction to GraalVM and Native Image
JJUG CCC 2017 Spring LT about JPA
Asakusa バッチの運用を支える技術
JVMの中身を可視化してみた
ななめ45°から見たJavaOne
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Mbed2013
Data Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdays
Lt talk 2017_0912
Ad

More from Hiroyuki Ohnaka (20)

PDF
remote Docker over SSHが熱い
PDF
VSCode Remote Container & GitHub Codespacesで拓く次世代のJava開発体験
PDF
Remote Development with Visual Studio Code & A clean dev env, working every ...
PDF
ChefとItamaeをニコイチしてAnsibleにマイグレーションした話
PDF
「WindowsデスクトップでWeb開発 改訂版」サンプル
PDF
Mackerelの薄い本
PDF
Microsoft DocsにContributeした話
PDF
Azure functions+typescript
PDF
技術書典4 く-35「錬金術MeetUp」 Alchemist Vol.1 サンプル版
PDF
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
PDF
仮想通貨始めました~GethではじめるEthereum~
PDF
錬金術MeetUpへのお誘い
PDF
Mackerelではじめる お手軽サーバー監視
PDF
「GebとSpockではじめるシステムテスト自動化」
PDF
TDDはじめて物語Second Season(updated)
PDF
TDDはじめて物語 Second Season #tddbc
PDF
XP祭り2017 LT 「DevOps再考」(改題)
PDF
JDK9の真の目玉機能はこれだ!
PDF
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
PDF
「すいーとみゅーじっく」のできるまで
remote Docker over SSHが熱い
VSCode Remote Container & GitHub Codespacesで拓く次世代のJava開発体験
Remote Development with Visual Studio Code & A clean dev env, working every ...
ChefとItamaeをニコイチしてAnsibleにマイグレーションした話
「WindowsデスクトップでWeb開発 改訂版」サンプル
Mackerelの薄い本
Microsoft DocsにContributeした話
Azure functions+typescript
技術書典4 く-35「錬金術MeetUp」 Alchemist Vol.1 サンプル版
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
仮想通貨始めました~GethではじめるEthereum~
錬金術MeetUpへのお誘い
Mackerelではじめる お手軽サーバー監視
「GebとSpockではじめるシステムテスト自動化」
TDDはじめて物語Second Season(updated)
TDDはじめて物語 Second Season #tddbc
XP祭り2017 LT 「DevOps再考」(改題)
JDK9の真の目玉機能はこれだ!
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
「すいーとみゅーじっく」のできるまで

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