2011-09-28 20 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) 

私のOSがあります。Linux 2.6.27.45-光沢1.8.3.ddn3.3#1 SMP火10月19日午後三時02分53秒BST 2010 x86_64のGNU/Linuxと私は全くありません静的クラス。 私のアプリケーションを呼び出す方法 - java -Xmx120m -jar/path/to/app。コードにバグがあったら、高価なオペレーション、フレークなロジックなんて何でも分かります。しかし、メインクラスの後の最初の声明とそのような遅いスタートを持つ私はそれが正常だとは思わない。

+0

どのOSを使用していますか? – neworld

+0

"slow"を定義できますか?どれくらい遅いですか? –

+2

'java -verbose'または' java -verbose:class'を使って実行することができます。あなたの_ _ code_が多くのクラスの読み込みを要求している場合は、時間がかかることがあります。 – 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

"main"メソッドは必ずしも実行される最初のコードではありません。

クラスがロードされるときに静的初期化コードが最初に実行されるため、この静的初期化コードの一部が実行に時間がかかる可能性があります。

0

あなたはそれが遅いと思うなら、あなたの最初の行動はそれを定量化することです。

たとえば、コマンドがすぐに実行されて終了する場合、コマンドの開始時刻から終了時刻までの合計時間にtimeコマンドを使用できます。

例: $ time java -cp。 MyClassInTrouble

問題の問題は簡単ですが、まだ起動が遅いと仮定します。 straceを見れば、システムコールレベルでブレークダウンを見ることができ、(プログラムではなく)JVMの起動に費やされた時間を簡単に感じることができます。

関連する問題