2011-09-28 476 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啓動(而不是您的程序)上花費了多少時間。