Комментарии (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 имеет несколько значений:
- Временная шкала — период выполнения программы
- Runtime класс — встроенный класс для взаимодействия с JVM
- Runtime exception — исключения, которые происходят во время выполнения
- Runtime поведение — как программа работает, а не как она скомпилирована
Понимание runtime важно для:
- Отладки и профилирования
- Оптимизации производительности
- Управления памятью и ресурсами
- Обработки исключений
- Конфигурирования JVM параметров