非常慢的java应用程序启动

时间:2011-09-28 09:41:07

标签: java performance

我有一个非常奇怪的问题。我的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。如果我在代码中有一个错误 - 我会理解 - 昂贵的操作,不稳定的逻辑 - 无论如何。但是在主要课程之后的第一个声明并且开始这么慢,我不认为这是正常的。

3 个答案:

答案 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启动(而不是您的程序)花费了多少时间。

相关问题