簡體   English   中英

如何測量 JVM 啟動時間?

[英]How do I measure JVM startup time?

我有一個用 java 編寫的應用程序,我想知道在達到static void int main(String args)之前需要多長時間,以及在那個階段它在做什么,我該如何實現?

我知道微軟有一個名為 MPGO(管理器配置文件引導優化)的工具,是否有 Java 的等價物?

從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);
    }
}

您可以使用JVMTI代理來跟蹤VM事件,如類加載,垃圾收集,方法編譯等。這是一個我做過的簡單代理--vmtrace (以及用於Windows的編譯后的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
...

使用java 9,您可以添加-Xlog:class+init=info:file=trace.log來跟蹤類初始化(這是類加載后的下一步),然后對主類進行過濾。 這是一種新的日志記錄功能

您還可以告訴它記錄所有內容以查看啟動前發生的情況,但記錄的事件數量可能會扭曲結果。

在java 8及更低版本中,不同的VM組件有自己的日志記錄(通常只是通過printf),而類加載是不包含時間戳的類。

如果你使用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)

jps

使用此ID可以執行以下操作

jstat -class {vmid} 1000 10

這將每秒提供一次類加載器的快照,持續十秒鍾。

另一種測量啟動時間的方法是使用自Java 9起可用的ProcessHandle

public static void main(String[] args) {
    var currentTimeMillis = System.currentTimeMillis();
    var processStartTime = ProcessHandle.current().info().startInstant().get();
    System.out.println(currentTimeMillis - processStartTime.toEpochMilli());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM