← Назад к вопросам

Что такое Run time?

1.3 Junior🔥 121 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Runtime?

Определение

Runtime (время выполнения) — это период, когда программа активно работает после её запуска. В контексте Java, это когда код выполняется на JVM (Java Virtual Machine), в отличие от compile time (время компиляции) и design time (время разработки).

Сравнение времён

Design Time (Время разработки)
  ↓ Написание кода
Source Code (.java файлы)
  ↓ Компиляция (javac)
Compile Time (Время компиляции)
  ↓ Проверка синтаксиса, типов
Bytecode (.class файлы)
  ↓ Запуск (java MyApp)
Runtime (Время выполнения)
  ↓ Интерпретация и JIT компиляция
Основная память, логи, результаты

Runtime класс в Java

Встроенный класс Runtime:

public class RuntimeExample {
    public static void main(String[] args) {
        // Получить объект Runtime
        Runtime runtime = Runtime.getRuntime();
        
        // Информация о памяти
        System.out.println("Total memory: " + runtime.totalMemory()); // Выделено JVM
        System.out.println("Free memory: " + runtime.freeMemory());   // Свободно
        System.out.println("Max memory: " + runtime.maxMemory());     // Максимум
        
        // Количество процессоров
        System.out.println("Available processors: " + runtime.availableProcessors());
        
        // Выполнить внешнюю команду
        try {
            Process process = runtime.exec("ls -la");
            // Процесс выполняется
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // Выполнить garbage collection
        runtime.gc();
        
        // Завершить JVM
        runtime.halt(0); // Immediate shutdown
        // или
        System.exit(0);  // Graceful shutdown
    }
}

Информация об окружении

System класс для runtime информации:

public class SystemProperties {
    public static void main(String[] args) {
        // Информация о JVM
        System.out.println(System.getProperty("java.version"));
        System.out.println(System.getProperty("java.vendor"));
        System.out.println(System.getProperty("java.vm.name"));
        
        // Информация об ОС
        System.out.println(System.getProperty("os.name"));
        System.out.println(System.getProperty("os.arch"));
        System.out.println(System.getProperty("os.version"));
        
        // Пути и переменные
        System.out.println(System.getProperty("user.dir")); // Текущая директория
        System.out.println(System.getProperty("user.home")); // Home директория
        System.out.println(System.getProperty("java.class.path")); // Classpath
        
        // Кастомные свойства
        System.setProperty("app.environment", "production");
        String env = System.getProperty("app.environment");
    }
}

Runtime exceptions

Ошибки, которые происходят во время выполнения:

public class RuntimeExceptions {
    public static void main(String[] args) {
        // 1. NullPointerException
        String str = null;
        try {
            System.out.println(str.length()); // RuntimeException!
        } catch (NullPointerException e) {
            System.out.println("Caught NPE at runtime");
        }
        
        // 2. ArrayIndexOutOfBoundsException
        int[] array = {1, 2, 3};
        try {
            System.out.println(array[10]); // RuntimeException!
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Index out of bounds at runtime");
        }
        
        // 3. ClassCastException
        Object obj = "Hello";
        try {
            Integer num = (Integer) obj; // RuntimeException!
        } catch (ClassCastException e) {
            System.out.println("Cannot cast at runtime");
        }
        
        // 4. ArithmeticException
        try {
            int result = 10 / 0; // RuntimeException!
        } catch (ArithmeticException e) {
            System.out.println("Cannot divide by zero at runtime");
        }
    }
}

Runtime vs Compile-time ошибки

Compile-time (Ошибки компиляции):

public class CompileTimeErrors {
    public static void main(String[] args) {
        // ❌ COMPILE ERROR - не скомпилируется
        int x = "hello"; // Type mismatch
        
        // ❌ COMPILE ERROR
        System.out.println(undefinedVariable); // Undefined variable
        
        // ❌ COMPILE ERROR
        UndefinedClass obj = new UndefinedClass(); // Unknown class
    }
}
// javac выдаст ошибку, файл не скомпилируется

Runtime (Ошибки выполнения):

public class RuntimeErrors {
    public static void main(String[] args) {
        // ✅ КОМПИЛИРУЕТСЯ без ошибок
        Object obj = "hello";
        Integer num = (Integer) obj; // ❌ RUNTIME ERROR!
        // ClassCastException только во время выполнения
        
        // ✅ КОМПИЛИРУЕТСЯ
        int[] arr = new int[5];
        System.out.println(arr[10]); // ❌ RUNTIME ERROR!
        // ArrayIndexOutOfBoundsException только во время выполнения
    }
}

Loading и linking во время Runtime

Динамическая загрузка классов:

public class DynamicLoading {
    public static void main(String[] args) throws ClassNotFoundException {
        // 1. Статическая загрузка (compile-time)
        String str = "Hello"; // String загружается автоматически
        
        // 2. Динамическая загрузка (runtime)
        Class<?> clazz = Class.forName("java.util.ArrayList");
        System.out.println("Loaded: " + clazz.getName());
        
        // 3. Рефлексия (только в runtime)
        try {
            Object list = clazz.getDeclaredConstructor().newInstance();
            System.out.println("Instance created: " + list.getClass());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ClassLoader во время Runtime

public class ClassLoaderExample {
    public static void main(String[] args) {
        // Получить информацию о загрузке класса
        ClassLoader loader = String.class.getClassLoader();
        System.out.println("ClassLoader for String: " + loader);
        
        // Разные ClassLoaders для разных целей
        ClassLoader appLoader = ClassLoaderExample.class.getClassLoader();
        ClassLoader systemLoader = ClassLoader.getSystemClassLoader();
        ClassLoader extLoader = appLoader.getParent();
        
        System.out.println("Application ClassLoader: " + appLoader);
        System.out.println("System ClassLoader: " + systemLoader);
        System.out.println("Extension ClassLoader: " + extLoader);
        
        // Иерархия загрузки
        // Bootstrap ClassLoader (rt.jar)
        //   ↓
        // Extension ClassLoader (jre/lib/ext)
        //   ↓
        // Application ClassLoader (classpath)
    }
}

Мониторинг Runtime поведения

JVM параметры для анализа runtime:

# Информация о сборке мусора
java -XX:+PrintGCDetails -XX:+PrintGCTimeStamps MyApp

# Отслеживание загрузки классов
java -XX:+TraceClassLoading -XX:+TraceClassUnloading MyApp

# Профилирование потоков
java -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -prof:jvmti MyApp

# Настройка памяти на runtime
java -Xms512m -Xmx2g -XX:MaxNewSize=512m MyApp

Профилирование runtime производительности

public class RuntimePerformance {
    public static void main(String[] args) {
        // Измерение времени
        long startTime = System.currentTimeMillis();
        doSomething();
        long endTime = System.currentTimeMillis();
        System.out.println("Execution time: " + (endTime - startTime) + "ms");
        
        // Более точное измерение
        long nanoStart = System.nanoTime();
        doSomething();
        long nanoEnd = System.nanoTime();
        System.out.println("Nano time: " + (nanoEnd - nanoStart) + "ns");
        
        // Информация о памяти во время выполнения
        Runtime runtime = Runtime.getRuntime();
        long beforeMemory = runtime.totalMemory() - runtime.freeMemory();
        
        // Создаём объекты
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 1_000_000; i++) {
            list.add("Item " + i);
        }
        
        long afterMemory = runtime.totalMemory() - runtime.freeMemory();
        System.out.println("Memory used: " + (afterMemory - beforeMemory) + " bytes");
    }
    
    static void doSomething() {
        for (int i = 0; i < 1_000_000; i++) {
            Math.sqrt(i);
        }
    }
}

Shutdown hooks во время Runtime

public class ShutdownHooks {
    public static void main(String[] args) {
        // Действие перед завершением JVM
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("Application is shutting down...");
            // Закрыть ресурсы
            // Сохранить данные
            // Логирование
        }));
        
        System.out.println("Application started");
        
        // Simulate work
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        // Завершение
        System.exit(0);
        // ShutdownHook выполнится перед выходом
    }
}

Runtime конфигурирование

@SpringBootApplication
public class RuntimeConfiguration {
    public static void main(String[] args) {
        // Установить runtime свойства ДО запуска
        System.setProperty("app.environment", "production");
        System.setProperty("logging.level.root", "INFO");
        
        SpringApplication.run(RuntimeConfiguration.class, args);
    }
    
    @Bean
    public ApplicationRunner applicationRunner() {
        return args -> {
            // Выполнить код при запуске приложения
            Runtime runtime = Runtime.getRuntime();
            System.out.println("Runtime initialized");
            System.out.println("Available processors: " + runtime.availableProcessors());
            System.out.println("Max memory: " + runtime.maxMemory() / (1024 * 1024) + "MB");
        };
    }
}

Обработка runtime ошибок

public class RuntimeErrorHandling {
    public static void main(String[] args) {
        // Глобальный обработчик uncaught exceptions
        Thread.setDefaultUncaughtExceptionHandler(
            (thread, throwable) -> {
                System.err.println("Uncaught exception in " + thread.getName());
                throwable.printStackTrace();
                // Логирование, алерты и т.д.
            }
        );
        
        // Теперь всех необработанных исключений будут перехвачены
        new Thread(() -> {
            throw new RuntimeException("Error in background thread");
        }).start();
    }
}

Итог

Runtime в Java имеет несколько значений:

  1. Временная шкала — период выполнения программы
  2. Runtime класс — встроенный класс для взаимодействия с JVM
  3. Runtime exception — исключения, которые происходят во время выполнения
  4. Runtime поведение — как программа работает, а не как она скомпилирована

Понимание runtime важно для:

  • Отладки и профилирования
  • Оптимизации производительности
  • Управления памятью и ресурсами
  • Обработки исключений
  • Конфигурирования JVM параметров
Что такое Run time? | PrepBro