Очень медленный запуск Java-приложения - PullRequest
1 голос
/ 28 сентября 2011

У меня очень странная проблема.Мое 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-luster-1.8.3.ddn3.3 # 1 SMP вт 19 октября 15:02:53 BST 2010 x86_64 GNU / Linux и яне имеют статических классов.Способ вызова моего приложения - java -Xmx120m -jar / path / to / app.Если бы у меня была ошибка в коде - я бы понял - дорогая операция, нестабильная логика - что угодно.Но первое утверждение после основного класса и такой медленный старт, я не думаю, что это нормально.

Ответы [ 3 ]

3 голосов
/ 28 сентября 2011

Есть ли в вашем коде большие статические классы? Они выполняются перед первой строкой main. Например, следующий код сначала выведет «Кора» и «Мы закончили лаять сейчас?» второй.

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 голосов
/ 28 сентября 2011

Метод "main" не обязательно является первым выполненным кодом.

Статический код инициализации выполняется первым при загрузке классов, поэтому возможно, что часть этого статического кода инициализации занимает много времени длябежать.

0 голосов
/ 28 сентября 2011

Если вы думаете, что это медленно, ваше первое действие - определить его количественно.

Например, если команда будет выполнена и завершится почти сразу, вы можете использовать команду «время» для общего времени.для команды от начала загрузки до конца.

Пример: $ time java -cp.MyClassInTrouble

Если предположить, что рассматриваемая проблема достаточно проста, но при этом у вас все еще наблюдается медленный запуск.Вы можете видеть, как можно увидеть разрыв на уровне системных вызовов, и легко понять, сколько времени уходит на запуск JVM (вместо вашей программы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...