2011-09-28 472 views
1

我有一个很奇怪的问题。我的Java应用程序启动非常慢。以下是一段代码:非常慢的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语句不是即时打印它。我尝试了远程分析 - 无济于事,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光泽-1.8.3.ddn3.3#1 SMP星期二10月19日15时02分53秒BST 2010 x86_64的GNU/Linux和我没有静态类。 我调用我的应用程序的方式 - java -Xmx120m -jar/path/to/app。如果我有代码中的错误 - 我会理解 - 昂贵的操作,片状逻辑 - 无论如何。但是,主班后的第一个声明,启动缓慢,我不认为这是正常的。

+0

你使用哪个操作系统? – neworld

+0

你能定义“慢”吗?它有多慢? –

+2

您可以尝试使用'java -verbose'或'java -verbose:class'运行它。如果您的其他代码需要加载很多类,则可能需要一些时间。 – Matteo

回答

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

请注意,只有在显式调用构造函数时才会发生这种情况。

2

“主”方法不一定是第一个执行的代码。

静态初始化代码首先在加载类时执行,所以有可能这些静态初始化代码需要很长时间才能运行。

0

如果你认为它很慢,你的第一个行动是量化它。

例如,如果命令几乎立即执行并完成,则可以使用“time”命令来指定从加载开始到结束的命令的总时间。

例如: $ time java -cp。 MyClassInTrouble

假设问题很简单,但仍然遇到启动缓慢的问题。您可以看到strace在系统调用级别看到崩溃,并轻松地了解在JVM启动(而不是您的程序)上花费了多少时间。