我有一个非常奇怪的问题。我的java应用程序启动速度非常慢。这是一段代码:
public static void main(String[] args) {
System.out.println("Is this going to be printed really fast?");
if (args.length == 0) {
//other code below
即便是println语句也不会立即打印出来。我试过远程profilling - 无济于事JVM显然没有足够快的自举。我尝试在println上设置断点,然后远程连接调试器 - 断点不会被击中几分钟。我的JVM版本:
java -Xmx120m -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
我的操作系统是:Linux 2.6.27.45-luster-1.8.3.ddn3.3#1 SMP Tue Oct 19 15:02:53 BST 2010 x86_64 GNU / Linux我没有静态类。 我调用我的应用程序的方式 - java -Xmx120m -jar / path / to / app。如果我在代码中有一个错误 - 我会理解 - 昂贵的操作,不稳定的逻辑 - 无论如何。但是在主要课程之后的第一个声明并且开始这么慢,我不认为这是正常的。
答案 0 :(得分:3)
您的代码中是否初始化了大型静态类?它们在main
的第一行之前执行。例如,下面的代码将首先输出“Bark”和“我们现在是在吠叫吗?”第二
public class Example
{
static Woof w = new Woof();
public static void main( String[] args )
{
System.out.println("Are we done barking now?");
}
}
class Woof
{
Woof()
{
System.out.println("Bark");
}
}
请注意,这仅在显式调用构造函数时才会发生。
答案 1 :(得分:2)
“main”方法不一定是第一个执行的代码。
静态初始化代码首先在加载类时执行,因此有些静态初始化代码可能需要很长时间才能运行。
答案 2 :(得分:0)
如果你觉得它很慢,你的第一个动作就是量化它。
例如,如果命令几乎立即执行并完成,则可以使用“time”命令来指示从加载开始到结束命令的总时间。
实施例: $ time java -cp。 MyClassInTrouble
假设这个问题很简单,但你仍然会遇到启动缓慢的问题。您可以看到strace以查看系统调用级别的细分,并轻松了解JVM启动(而不是您的程序)花费了多少时间。