我有一个用java编写的应用程序,我想知道在到达static void int main(String args)
之前需要花费多少时间以及它在那个阶段做了什么我该如何实现呢?
我知道微软有一个名为MPGO的工具(Manager配置文件引导优化)是否有与Java等效的工具?
答案 0 :(得分:7)
从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(和compiled dll for窗口)。
运行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
...
答案 1 :(得分:4)
使用java 9,您可以添加-Xlog:class+init=info:file=trace.log
来跟踪类初始化(这是类加载后的下一步),然后过滤主类。这是一个新的logging feature。
您还可以告诉它记录所有内容以查看启动前发生的情况,但记录的事件数量可能会扭曲结果。
在java 8及更低版本中,不同的VM组件有自己的日志记录(通常只是通过printf),类加载是不包含时间戳的。
答案 2 :(得分:0)
如果您使用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
这将每秒提供一次类加载器的快照,持续十秒钟。