2011-09-28 6 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 Вт 19 октября 15:02:53 BST 2010 x86_64 GNU/Linux и у меня нет статические классы. Способ, которым я вызываю свое приложение - java -Xmx120m -jar/path/to/app. Если бы у меня была ошибка в коде - я бы понял - дорогая операция, flaky logic - что угодно. Но первое утверждение после основного класса и с таким медленным запуском я не думаю, что это нормально.

+0

Какая ОС вы используете? – neworld

+0

Не могли бы вы определить «медленный»? Как медленно? –

+2

Вы можете попробовать запустить его с помощью 'java -verbose' или' java -verbose: class'. Если ваш _other код_ требует загрузки многих классов, это может занять некоторое время. – 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 java -cp. MyClassInTrouble

Предполагая, что проблема, о которой идет речь, достаточно проста, но вы по-прежнему испытываете медленный запуск. Вы можете увидеть strace, чтобы увидеть разрыв на уровне системного вызова и получить легкое представление о том, сколько времени потрачено на запуск JVM (вместо вашей программы).

Смежные вопросы