Tag: Java

Java オプション

JavaVMのメモリ領域に関するVM引数

||オプション ||説明 ||-Xms ||ヒープ全体の初期値 ||-Xmx ||ヒープ全体の最大値 ||-XX:NewSize ||New領域の初期値(-Xmnと同じ) ||-XX:MaxNewSize ||New領域の最大値 ||-XX:PermSize ||Permanent領域の初期値 ||-XX:MaxPermSize||Permanent領域の最大値 ||-Xss ||スレッドスタックの領域(デフォルト512k)

※OSによっては1つのJavaプロセスに割り当てられるヒープに制限がある場合があるので注意が必要

http://docs.oracle.com/cd/E19528-01/820-1613/6nd986vcr/index.html#abeii

その他VM引数

||オプション||説明 ||-client || HotSpot VMのクライアントモードを有効化 ||-server || HotSpot VMのサーバーモードを有効化

※HotSpot VMは-clientと-serverオプションによりクライアント用VMとサーバ用VMを使い分けることができる。

※HotSpotはクライアント版、サーバ版と呼ばれる二つの互換版からなる。クライアント版は必要不可欠なクラスやメソッドのみを素速くロードしコンパイルするようチューニ ングする。サーバ版は、よりゆっくりロードを行うが、より高性能な高度に最適化されたJITコンパイル結果を産出することに、より尽力する。

VM引数のまとめ

http://d.hatena.ne.jp/tanakakns/20120508/1336467306

まとめると以下くらいの感じでよいのでは。

Webアプリを想定。

-server
-Xms1024m
-Xmx1024m
-XX:NewSize384m
-XX:MaxNewSize384m
-XX:PermSize=128m
-XX:MaxPermSize=128m
-XX:+DisableExplicitGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseParNewGC
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=32
-XX:TargetSurvivorRatio=80
-Xloggc:/[ログ出力先]/gc.`date '+%Y-%m-%d'`.log
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PringGCDateStamps
-XX:+PrintClassHistogram
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/[ヒープダンプ出力先]/java.hprof
Read more...

Java トラブルシューティング

トラブル解決フロー

問題発生 → 基本データ分析 →GCログ解析

  • GCが頻発している → Heapチューニング → GCログ解析
    • GCが頻発している → オブジェクトのプロファイリング
      • オブジェクトに問題あり → ソース修正
      • オブジェクトに問題なし → OS,ミドルウェアの設定値再確認
    • GCが頻発していない → 解決!!
  • GCが頻発していない → CPUの使用率確認
    • CPUがボトルネックである → メソッドのプロファイリング(特定の処理の重いメソッドが何度も呼ばれていないか?)
      • メソッドに問題あり → ソース修正
      • メソッドに問題なし → OS,ミドルウェアの設定値再確認
    • CPUがボトルネックではない → スレッドダンプ解析
      • スレッドダンプ問題あり → プールオブジェクト解析
      • *プールオブジェクト問題あり → OS,ミドルウェアの設定値再確認
      • *プールオブジェクト問題なし → ソース修正
      • スレッドダンプ問題なし → メソッドのプロファイリング(特定の処理の重いメソッドが何度も呼ばれていないか?)
      • *メソッドに問題あり → ソース修正
      • *メソッドに問題なし → OS,ミドルウェアの設定値再確認

1.Javaヒープ領域がOutOfMemoryとなる場合

【応急処置】

-Xms、-Xmxを指定し、OutOfMemoryErrorが発生しないようにヒープを広げる。

【原因調査】

GCログを取得し、ヒープでのメモリリークが発生していないか確認する。

GCログを侍やGCViewer、Excel等でグラフ化して確認する。

グラフがFull GCを跨って、右肩上がりになっている場合は、メモリリークが発生している可能性が高い。

リーク箇所を発見するには、ヒープ統計情報やヒープダンプを数回取得して比較して、Full GCを経ても増加し続けているオブジェクトを探す。

怪しいオブジェクトが見つかれば、NetBeans Profiler等を使用して、オブジェクトの使用箇所を探し、オブジェクト参照を追跡する。

2.ヒープチューニング方法

【方針】

Full GC実行時間を最小にするために、OutOfMemoryErrorが発生しないサイズでなるべく小さいサイズを-Xms、-Xmxに指定する。

Read more...

Javaヒープ

ヒープ

http://d.hatena.ne.jp/tanakakns/20120508/1336467306

^^^^^JavaヒープJavaVM上で起動するJavaプログラムのリソースを管理する領域。New領域とOld領域で構成される。
^^^New領域新規オブジェクトと閾値(-XX:MaxTenuringThreshold)未満のオブジェクトが配置される。(Young領域とも呼ばれる)
Eden領域新規のオブジェクトが配置される。
From領域CopyGC(ScavengeGC、マイナーGC)が実行された際に、使用中のオブジェクトはここへコピーされる。(S0やS1とも呼ばれる)
To領域CopyGC(ScavengeGC、マイナーGC)が実行された際に、使用中のオブジェクトはここへコピーされる。(S0やS1とも呼ばれる)
Old領域New領域で閾値(-XX:MaxTenuringThreshold)を超えたオブジェクトが配置される。(Tenured領域とも呼ばれる)
Permanent領域クラスやメソッドの情報が格納される領域であり、アプリケーション起動後はほとんど増減しない。
CヒープJavaVM自身のリソースを管理する領域。NativeMethod、Javaスレッド自身、(8k以上の)バッファ領域として利用される。
スレッドスタックスレッド毎に保持するスタックの領域。
※「New領域」=「Eden領域」+「From領域」+「To領域」
※From、To領域をあわせてSurvivor領域と呼ぶ。

ヒープの使用状況を確認する方法

http://d.hatena.ne.jp/tanakakns/20120508/1336467306

  • jstat
    • JDKにデフォルトで同梱されているコマンド。
    • -gcutilオプションで、From(S0)、To(S1)、Eden、Old、Permanent領域ごとの使用率やマイナーGC、Full GCの発生回数、GCの実行時間累計が確認可能。
    • すでに起動中のJavaプロセス(jpsコマンドで取得)のヒープの使用状況をリアルタイムに確認することができる。
    • (例)jstat -gcutil -h10 <pid> 5000
  • jconsole

ヒープダンプの統計情報を取得する方法

  • -XX:+HeapDumpOnCtrlBreakを設定しておき、kill -3 <pid>を実行 (Java 1.5の場合)
  • -verbose:gc(-Xloggc:<path_to_file>)、-XX:+PrintClassHistogramを設定しておき、kill -3 <pid>を実行
  • jmap -heap:format=b <pid>(Java 1.5の場合)
    • 「heap:format=b」はバイナリで出力するという意味
  • jmap -dump:format=b,file=filename <pid>(Java 1.6の場合)
    • 実行できなかった場合は「jmap -F -dump:format=b,file=filename <pid>」で実行してみる
  • -XX:+HeapDumpOnOutOfMemoryErrorを設定しておき、OutOfMemoryErrorが発生

※上記の方法で詳細なヒープ情報を取得可能であるが、出力には時間がかかり、また負荷も大きいので注意が必要。

Read more...

Java

Java6 2013/02/04 現在の最新アップデート

全オペレーティング・システム用のJavaのダウンロード Version 6 Update 39

チューニング

すごい沢山のチューニングポイントがある。

Javaメモリ、GCチューニングとそれにまつわるトラブル対応手順まとめ - 日記のような何か

snmpで情報取得

wall-climb ≫ JVM SNMP監視オプション

JVM SNMP監視オプション
Posted in Java, Tomcat by admin
Sun JDK1.5以上のTomcatの起動オプションでJVMのSNMP監視機能を有効にする場合は、
以下のような引数を追加することで可能となる。
「CATALINA_OPTSとJAVA_OPTSの違い」で記述したように、
Tomcatの環境変数に設定する場合は必ず「CATALINA_OPTS」に定義すること。

[[負荷]]に関連して

JavaVMの中を調べることはできないか? Java VM(Java仮想マシン)には、JVMPIやJVMTI、JVMDIと呼ばれる、

パフォーマンス情報を提供するための専用APIが備わっています。

この仕組みを利用して、Java EEアプリケーションサーバーからパフォーマンスデータを収集し、チューニングをサポートするのがプロファイラ(計測ツール)です。

プロファイラの基本機能は以下の2点に集約できます。

Javaアプリケーション内の各クラス・メソッドの呼び出し関係の記録と、それぞれの処理に掛かった時間の計測

実行中のJava VMに割り当てられているヒープ領域を監視し、オブジェクトの生成状況を調査

また、製品によっては、以下のような機能を付加することで、より幅広い視点でJavaアプリケーションの品質を分析できます。

テスト網羅率を数値化できるカバレッジ計測、デッドロックなどスレッド問題の検出

CPU、HDDなどハードウェア情報の収集

JVMTI(Java Virtual Machine Tool Interface)の方が新しい。 Java6からはJVMTIのみが正式サポートという扱い。

22.8. Java 対応の OProfile サポート - Red Hat Customer Portal

メモリ

[[Java講座 [Javaのメモリ管理 - GC、ガベージコレクション、Heap ]|http://www.site-cooler.com/java/j2se/memory.htm]]

ガベージコレクション
Heap領域
メモリリーク

について書かれている

Read more...