2016-09-04 8 views
7

私はJavaで書かれたアプリケーションを持っていて、static void int main(String args)に達するまでにどれくらいの時間がかかっているのか、その段階で何をしているのですか?JVMの起動時間を測定するにはどうすればよいですか?

私は、MicrosoftにはMPGO(マネージャプロファイルの最適化)というツールがあることを認識していますが、Javaに相当するものはありますか?

答えて

5

Javaアプリケーション内から起動時間を測定する簡単な方法:

import java.lang.management.ManagementFactory; 

public class Test { 

    public static void main(String[] args) { 
     long currentTime = System.currentTimeMillis(); 
     long vmStartTime = ManagementFactory.getRuntimeMXBean().getStartTime(); 
     System.out.println(currentTime - vmStartTime); 
    } 
} 

あなたはここでクラスのロードのようなVMイベント、ガベージコレクション、メソッドのコンパイルなどをトレースするためJVMTI agentを使用することができ、簡単な薬剤であるI made - vmtrace(Windowsの場合はcompiled dll)。

実行java -agentpath:path\to\vmtrace.dll Main、およびイベントトレースは、stderrに印刷されます。

[0.00000] VMTrace started 
[0.00182] Dynamic code generated: flush_icache_stub 
[0.00187] Dynamic code generated: get_cpu_info_stub 
[0.00519] Dynamic code generated: getCPUIDNameInfo_stub 
[0.00524] Dynamic code generated: forward exception 
[0.00526] Dynamic code generated: call_stub 
... 
[0.01182] Loading class: java/lang/Object 
[0.01198] Loading class: java/lang/String 
[0.01206] Loading class: java/io/Serializable 
... 
[0.05620] VM initialized 
[0.05664] Class prepared: java/lang/invoke/MethodHandle 
[0.05672] Loading class: java/lang/invoke/MethodHandleImpl 
[0.05732] Class prepared: java/lang/invoke/MethodHandleImpl 
[0.05738] Loading class: java/lang/invoke/MethodHandleImpl$1 
[0.05743] Class prepared: java/lang/invoke/MethodHandleImpl$1 
[0.05755] Loading class: java/lang/invoke/MethodHandleImpl$2 
[0.05759] Loading class: java/util/function/Function 
[0.05768] Class prepared: java/util/function/Function 
... 
+0

これを試してみて、結果を知らせてください。 – Har

+0

私はそれを試してみました。私は[0.02056] Dberと[0.031ber]のようなものを取得しています。もう1つの奇妙なことは、2つのVM起動メッセージが出てくることです。また、すべてのタイムスタンプが順次であるとは限りません。最後に、[VMTrace ended]という最後のレコードがありません。最後の2つのレコードの時間間隔を計算できます。 – Har

+1

@Harはい、マルチスレッド環境では、並行処理の問題が原因で混在しているように見えます。 ['trace'](https://github.com/apangin/vmtrace/blob/master/src/vmtrace.c#L25)関数を取り囲むmutexは、この問題を解決するはずです。エージェント出力をアプリケーション出力から分離する方が良い場合もあります。ファイル名をエージェント引数として指定することもできます。 – apangin

1

あなたはJRockit JVMのを使用している場合は、JVMのタイミングを理解するために、次のフラグを追加することができます

-Xverbose:codegen 

を起動更なる詳細は、こちらをhttps://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/slow_start.html#wp1083972

あるアップデート2016年5月9日

下記の会話に続きます。 jstatは、クラスローダーに関する時間ベースの統計情報を提供します。仮想マシンID(VMID)は、以下、このIDを持つ

jps 

を実行することによって得られなければならない。これは、クラスローダのスナップショットを10秒間、毎秒を提供する

jstat -class {vmid} 1000 10 

を実行することができます。

+0

は自由に8 SEバージョンをJavaで利用できるこれらのオプションがありますか? – Har

+1

最高の機能がホットスポットに統合されました。次のページのデバッグ見出しの下にあるJava 8の情報を参照してください。 http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html –

+1

ciTimeまたは多分traceClassLoadingを参照してください –

4

java 9を使用すると、クラスの初期化(クラスローディング後の次のステップ)に-Xlog:class+init=info:file=trace.logを追加して、メインクラスをフィルタすることができます。新しいlogging featureです。

起動前に何が起きているかをすべて記録するように指示することもできますが、ログに記録されるイベントの量によって結果が歪む可能性があります。

java 8以下のVMコンポーネントでは、独自のロギング(多くの場合printf経由)があり、クラスローディングはタイムスタンプを含まないものです。

+0

タイムスタンプを有効にするにはどうすれば指定しますか?私はこれまでのオプションを見つけることができません。-XX:+ TraceClassResolution -XX:+ TraceClassLoading -XX:+ UnlockDiagnosticVMOptions -XX:LogFile = C:\ Users \ Har \ out.txt -XX:+ PrintCompilation – Har

+1

誤って忘れてしまいました.8では、クラスの読み込みではなく、印刷コンパイルとGCログ(どちらも起動時間の決定には役に立ちません)のタイムスタンプしか取得できません。私はそれらの矛盾が1つの理由でログオンを統一したと思っています。 – the8472

関連する問題