如何测量JVM启动时间?

62o28rlo  于 2022-11-07  发布在  其他
关注(0)|答案(4)|浏览(210)

我有一个用java编写的应用程序,我想知道在达到static void int main(String args)之前需要多长时间,以及在该阶段它在做什么,我如何才能实现这一点?
我知道微软有一个叫做MPGO(管理器配置文件引导优化)的工具,Java有等价物吗?

cunj1qz1

cunj1qz11#

从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 agent来跟踪VM事件,如类加载、垃圾收集、方法编译等。下面是我制作的一个简单的代理-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
...
envsm3lx

envsm3lx2#

使用java 9,你可以将-Xlog:class+init=info:file=trace.log添加到跟踪类初始化中(这是类加载后的下一步),然后过滤你的主类。
您也可以让它记录所有事件,以查看启动前发生了什么,但记录的事件数量可能会扭曲结果。
在java 8和更低版本中,不同的VM组件有自己的日志记录(通常只是通过printf),类加载是不包括时间戳的。

aoyhnmkz

aoyhnmkz3#

测量启动时间的另一种方法是使用ProcessHandle,该方法自Java 9起可用:

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

tcomlyy64#

如果您使用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将提供关于类加载器的基于时间的统计信息。

jps

使用此id可以执行以下操作

jstat -class {vmid} 1000 10

这将在10秒内每秒提供一个类加载器的快照。

相关问题