Класс Runtime
public final class Runtime extends Object
Runtime, который позволяет приложению взаимодействовать со средой, в которой оно выполняется. Текущую среду выполнения можно получить с помощью метода getRuntime. Приложение не может создать собственный экземпляр этого класса.
Последовательность завершения работы
Виртуальная машина Java начинает последовательность завершения работы в ответ на одно из нескольких событий:
- когда число активных потоков, не являющихся потоками-демонами, впервые становится равным нулю (см. примечание ниже о JNI Invocation API);
- когда впервые вызывается метод
Runtime.exitилиSystem.exit; или - когда происходит какое-либо внешнее событие, например прерывание или получение сигнала от операционной системы.
В начале последовательности завершения работы зарегистрированные хуки завершения работы запускаются в неопределённом порядке. Они выполняются одновременно с любыми потоками-демонами и обычными потоками, которые были активны в начале последовательности завершения работы.
После начала последовательности завершения работы регистрация и отмена регистрации хуков завершения работы с помощью методов addShutdownHook и removeShutdownHook запрещены. Однако создавать и запускать новые потоки разрешено. Новые потоки выполняются одновременно с зарегистрированными хуками завершения работы и любыми уже работающими потоками-демонами и обычными потоками.
Последовательность завершения работы заканчивается, когда все хуки завершения работы завершают выполнение. В этот момент виртуальная машина Java завершает работу, как описано ниже.
Один или несколько хуков завершения работы могут не завершить выполнение, например из-за бесконечного цикла. В этом случае последовательность завершения работы никогда не закончится. Другие потоки и хуки завершения работы продолжают выполняться и могут завершить работу JVM с помощью метода halt.
До начала последовательности завершения работы программа может запустить хук завершения работы, явно вызвав его метод start. Если это происходит, поведение последовательности завершения работы не определено.
Завершение работы виртуальной машины Java
JVM завершает работу, когда заканчивается последовательность завершения работы или вызывается метод halt. В отличие от метода exit, метод halt не инициирует последовательность завершения работы.
При завершении работы JVM все потоки немедленно лишаются возможности выполнять дальнейший код Java. Это относится к хукам завершения работы, а также к потокам-демонам и обычным потокам. Это означает, например, что:
- текущие методы потоков не завершаются ни штатно, ни аварийно;
-
блоки
finallyне выполняются; - обработчики неперехваченных исключений не запускаются; и
- ресурсы, открытые с помощью конструкции try-with-resources, не закрываются;
- Примечание по реализации:
- Нативный код обычно использует JNI Invocation API для управления запуском и завершением работы JVM. Такой нативный код вызывает функцию
JNI_CreateJavaVMдля запуска JVM. Затем нативный код вызывает функциюDestroyJavaVM, чтобы дождаться завершения работы этой JVM. ФункцияDestroyJavaVMотвечает за начало последовательности завершения работы, когда число активных потоков, не являющихся потоками-демонами, впервые становится равным нулю. Когда последовательность завершения работы заканчивается и JVM завершает работу, управление возвращается нативному коду, вызвавшемуDestroyJavaVM. Это поведение отличается от поведения методовexitиhalt. Эти методы обычно завершают процесс операционной системы, в котором работает JVM, и не взаимодействуют с JNI Invocation API. - См. Спецификацию языка Java:
- 12.8 Выход из программы
- С версии:
- 1.0
- Внешние спецификации
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static final class |
Runtime.Version |
Представление строки версии реализации платформы Java SE. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
addShutdownHook |
Регистрирует новый хук завершения работы виртуальной машины. |
int |
availableProcessors() |
Возвращает число процессоров, доступных виртуальной машине Java. |
Process |
exec |
Устарел. |
Process |
exec |
Выполняет указанную команду с аргументами в отдельном процессе. |
Process |
exec |
Выполняет указанную команду с аргументами в отдельном процессе с указанным окружением. |
Process |
exec |
Выполняет указанную команду с аргументами в отдельном процессе с указанным окружением и рабочим каталогом. |
Process |
exec |
Устарел. Этот метод подвержен ошибкам и не должен использоваться; вместо него следует использовать соответствующий метод exec(String[], String[]) или ProcessBuilder. |
Process |
exec |
Устарел. Этот метод подвержен ошибкам и не должен использоваться; вместо него следует использовать соответствующий метод exec(String[], String[], File) или ProcessBuilder. |
void |
exit |
Инициирует последовательность завершения работы виртуальной машины Java. |
long |
freeMemory() |
Возвращает объём свободной памяти в виртуальной машине Java. |
void |
gc() |
Запускает сборщик мусора в виртуальной машине Java. |
static Runtime |
getRuntime() |
Возвращает объект среды выполнения, связанный с текущим приложением Java. |
void |
halt |
Немедленно завершает работу виртуальной машины Java. |
void |
load |
Ограниченный доступ. Загружает нативную библиотеку, указанную в аргументе filename. |
void |
loadLibrary |
Ограниченный доступ. Загружает нативную библиотеку, указанную в аргументе libname. |
long |
maxMemory() |
Возвращает максимальный объём памяти, который виртуальная машина Java попытается использовать. |
boolean |
removeShutdownHook |
Отменяет регистрацию ранее зарегистрированного хука завершения работы виртуальной машины. |
void |
runFinalization() |
Устарел, подлежит удалению: этот элемент API может быть удалён в будущей версии. Финализация объявлена устаревшей и подлежащей удалению. |
long |
totalMemory() |
Возвращает общий объём памяти в виртуальной машине Java. |
static Runtime.Version |
version() |
Возвращает версию среды выполнения Java в виде Runtime.Version. |
Подробное описание методов
getRuntime
public static Runtime getRuntime()
Runtime являются методами экземпляра и должны вызываться относительно текущего объекта среды выполнения.- Возвращает:
- объект
Runtime, связанный с текущим приложением Java.
exit
public void exit(int status)
Аргумент задаёт код состояния. По соглашению ненулевой код состояния указывает на аварийное завершение.
Успешные вызовы этого метода выполняются последовательно: только один вызов инициирует последовательность завершения работы и завершает работу виртуальной машины с указанным кодом состояния. Все остальные вызовы не выполняют никаких действий и блокируются на неопределённое время.
Поскольку успешный вызов этого метода блокируется на неопределённое время, его вызов из обработчика завершения работы не позволит этому обработчику завершиться. Вследствие этого последовательность завершения работы не сможет закончиться.
Метод System.exit является общепринятым и удобным способом вызова этого метода.
- Примечание по реализации:
- Если для системного средства ведения журнала для
java.lang.Runtimeвключён уровень журналированияLevel.DEBUG, в журнал записывается трассировка стека вызоваRuntime.exit(). - Параметры:
-
status- статус завершения. По соглашению ненулевой код состояния указывает на аварийное завершение. - См. также:
addShutdownHook
public void addShutdownHook(Thread hook)
Обработчик завершения работы — это просто инициализированный, но не запущенный поток. Обработчики завершения работы запускаются в начале последовательности завершения работы. Регистрация и отмена регистрации обработчиков завершения работы запрещены после начала последовательности завершения работы.
Неперехваченные исключения в обработчиках завершения работы обрабатываются так же, как и в любом другом потоке, согласно спецификации Thread.UncaughtExceptionHandler. После завершения работы обработчика неперехваченных исключений обработчик завершения работы считается завершившимся и не рассматривается иначе, чем обработчик, завершившийся без выброса неперехваченного исключения.
- Примечание API:
- Обработчики завершения работы выполняются в критический момент жизненного цикла виртуальной машины, поэтому их следует писать с особой осторожностью. В частности, они должны быть потокобезопасными и, насколько это возможно, избегать взаимных блокировок. Также им не следует безоговорочно полагаться на службы, которые могли зарегистрировать собственные обработчики завершения работы и поэтому сами могут находиться в процессе завершения работы. Попытки использовать другие службы, основанные на потоках, например поток диспетчеризации событий AWT, могут привести к взаимным блокировкам.
Обработчики завершения работы также должны быстро выполнять свою работу. Когда программа вызывает
exit, ожидается, что виртуальная машина вскоре завершит работу и выйдет. Если виртуальная машина завершается из-за выхода пользователя из системы или завершения работы системы, базовая операционная система может предоставить лишь ограниченное время для завершения работы и выхода. Поэтому не рекомендуется взаимодействовать с пользователем или выполнять длительные вычисления в обработчике завершения работы. - Параметры:
-
hook- инициализированный, но не запущенный объектThread - Выбрасывает:
-
IllegalArgumentException- если такой же обработчик (сравниваемый с помощью==), как указанный обработчик, уже зарегистрирован либо если можно определить, что обработчик уже выполняется или уже выполнялся -
IllegalStateException- если последовательность завершения работы уже началась - Начиная с версии:
- 1.3
- См. также:
removeShutdownHook
public boolean removeShutdownHook(Thread hook)
==. Регистрация и отмена регистрации обработчиков завершения работы запрещены после начала последовательности завершения работы.- Параметры:
-
hook- обработчик, который нужно удалить - Возвращает:
-
true, если указанный обработчик был ранее зарегистрирован и его регистрация успешно отменена, иfalseв противном случае. - Выбрасывает:
-
IllegalStateException- если последовательность завершения работы уже началась - Начиная с версии:
- 1.3
- См. также:
halt
public void halt(int status)
- Примечание API:
- Этот метод следует использовать с особой осторожностью. Его использование может обойти или нарушить любые действия по очистке, которые должны выполняться обработчиками завершения работы, что может привести к повреждению данных. Другие возможные последствия принудительного завершения работы виртуальной машины Java описаны в приведённом выше разделе «Завершение работы».
- Параметры:
-
status- статус завершения. По соглашению ненулевой код состояния указывает на аварийное завершение. Если методexit(или, что эквивалентно,System.exit) уже был вызван, этот код состояния заменит код состояния, переданный этому методу. - Начиная с версии:
- 1.3
- См. также:
exec
@Deprecated(since="18") public Process exec(String command) throws IOException
exec(String[]) или ProcessBuilder. Строка команды разбивается на токены с использованием только пробельных символов. Это может вызвать проблемы для аргумента, содержащего пробел, например имени файла, поскольку токен не будет включать полное имя файла.Это вспомогательный метод. Вызов вида exec(command) ведёт себя в точности так же, как вызов exec(command, null, null).
- Примечание по реализации:
- В эталонной реализации можно включить ведение журнала созданного процесса; подробности см. в описании
ProcessBuilder.start(). - Параметры:
-
command- указанная системная команда. - Возвращает:
- Новый объект
Processдля управления подпроцессом - Выбрасывает:
-
IOException- если возникает ошибка ввода-вывода -
NullPointerException- еслиcommandимеет значениеnull -
IllegalArgumentException- еслиcommandпуст - См. также:
exec
@Deprecated(since="18") public Process exec(String command, String[] envp) throws IOException
exec(String[], String[]) или ProcessBuilder. Строка команды разбивается на токены с использованием только пробельных символов. Это может вызвать проблемы для аргумента, содержащего пробел, например имени файла, поскольку токен не будет включать полное имя файла.Это вспомогательный метод. Вызов вида exec(command, envp) ведёт себя в точности так же, как вызов exec(command, envp, null).
- Примечание по реализации:
- В эталонной реализации можно включить ведение журнала созданного процесса; подробности см. в описании
ProcessBuilder.start(). - Параметры:
-
command- указанная системная команда. -
envp- массив строк, каждый элемент которого содержит настройки переменных окружения в формате name=value, илиnull, если подпроцесс должен наследовать окружение текущего процесса. - Возвращает:
- Новый объект
Processдля управления подпроцессом - Выбрасывает:
-
IOException- если возникает ошибка ввода-вывода -
NullPointerException- еслиcommandимеет значениеnullлибо один из элементовenvpимеет значениеnull -
IllegalArgumentException- еслиcommandпуст - См. также:
exec
@Deprecated(since="18") public Process exec(String command, String[] envp, File dir) throws IOException
exec(String[], String[], File) или ProcessBuilder. Строка команды разбивается на токены с использованием только пробельных символов. Это может вызвать проблемы для аргумента, содержащего пробел, например имени файла, поскольку токен не будет включать полное имя файла.Это вспомогательный метод. Вызов вида exec(command, envp, dir) ведёт себя в точности так же, как вызов exec(cmdarray, envp, dir), где cmdarray — массив всех токенов в command.
Точнее, строка command разбивается на токены с помощью StringTokenizer, созданного вызовом new StringTokenizer(command), без дальнейшего изменения категорий символов. Токены, полученные токенизатором, помещаются в новый строковый массив cmdarray в том же порядке.
- Примечание по реализации:
- В эталонной реализации можно включить ведение журнала созданного процесса; подробности см. в описании
ProcessBuilder.start(). - Параметры:
-
command- указанная системная команда. -
envp- массив строк, каждый элемент которого содержит настройки переменных окружения в формате name=value, илиnull, если подпроцесс должен наследовать окружение текущего процесса. -
dir- рабочий каталог подпроцесса илиnull, если подпроцесс должен наследовать рабочий каталог текущего процесса. - Возвращает:
- Новый объект
Processдля управления подпроцессом - Выбрасывает:
-
IOException- если возникает ошибка ввода-вывода -
NullPointerException- еслиcommandимеет значениеnullлибо один из элементовenvpимеет значениеnull -
IllegalArgumentException- еслиcommandпуст - Начиная с версии:
- 1.3
- См. также:
exec
public Process exec(String[] cmdarray) throws IOException
Это вспомогательный метод. Вызов вида exec(cmdarray) ведёт себя в точности так же, как вызов exec(cmdarray, null, null).
- Примечание по реализации:
- В эталонной реализации можно включить ведение журнала созданного процесса; подробности см. в описании
ProcessBuilder.start(). - Параметры:
-
cmdarray- массив, содержащий вызываемую команду и её аргументы. - Возвращает:
- Новый объект
Processдля управления подпроцессом - Выбрасывает:
-
IOException- если возникает ошибка ввода-вывода -
NullPointerException- еслиcmdarrayимеет значениеnullлибо один из элементовcmdarrayимеет значениеnull -
IndexOutOfBoundsException- еслиcmdarrayявляется пустым массивом (имеет длину0) - См. также:
exec
public Process exec(String[] cmdarray, String[] envp) throws IOException
Это вспомогательный метод. Вызов вида exec(cmdarray, envp) ведёт себя в точности так же, как вызов exec(cmdarray, envp, null).
- Примечание по реализации:
- В эталонной реализации можно включить ведение журнала созданного процесса; подробности см. в описании
ProcessBuilder.start(). - Параметры:
-
cmdarray- массив, содержащий вызываемую команду и её аргументы. -
envp- массив строк, каждый элемент которого содержит настройки переменных окружения в формате name=value, илиnull, если подпроцесс должен наследовать окружение текущего процесса. - Возвращает:
- Новый объект
Processдля управления подпроцессом - Выбрасывает:
-
IOException- если возникает ошибка ввода-вывода -
NullPointerException- еслиcmdarrayимеет значениеnull, один из элементовcmdarrayимеет значениеnullили один из элементовenvpимеет значениеnull -
IndexOutOfBoundsException- еслиcmdarrayявляется пустым массивом (имеет длину0) - См. также:
exec
public Process exec(String[] cmdarray, String[] envp, File dir) throws IOException
Получив массив строк cmdarray, представляющий токены командной строки, и массив строк envp, представляющий настройки переменных «окружения», этот метод создаёт новый процесс для выполнения указанной команды.
Этот метод проверяет, что cmdarray является допустимой командой операционной системы. Список допустимых команд зависит от системы, однако как минимум команда должна быть непустым списком строк, не содержащих значений null.
Если envp имеет значение null, подпроцесс наследует настройки окружения текущего процесса.
В некоторых операционных системах для запуска процесса может потребоваться минимальный набор системно-зависимых переменных окружения. Поэтому подпроцесс может наследовать дополнительные настройки переменных окружения помимо указанных в окружении. Минимальный набор системно-зависимых переменных окружения может переопределять значения, заданные в окружении.
Предпочтительным способом запуска процесса с изменённым окружением теперь является ProcessBuilder.start().
Рабочий каталог нового подпроцесса задаётся параметром dir. Если dir имеет значение null, подпроцесс наследует текущий рабочий каталог текущего процесса.
Запуск процесса операционной системы в значительной степени зависит от системы. Возможны, помимо прочего, следующие ошибки:
- Не найден файл программы операционной системы.
- Доступ к файлу программы запрещён.
- Рабочий каталог не существует.
В таких случаях будет выброшено исключение. Точный тип исключения зависит от системы, но оно всегда будет подклассом IOException.
Если операционная система не поддерживает создание процессов, будет выброшено исключение UnsupportedOperationException.
- Примечание по реализации:
- В эталонной реализации можно включить ведение журнала созданного процесса; подробности см. в описании
ProcessBuilder.start(). - Параметры:
-
cmdarray- массив, содержащий вызываемую команду и её аргументы. -
envp- массив строк, каждый элемент которого содержит настройки переменных окружения в формате name=value, илиnull, если подпроцесс должен наследовать окружение текущего процесса. -
dir- рабочий каталог подпроцесса илиnull, если подпроцесс должен наследовать рабочий каталог текущего процесса. - Возвращает:
- Новый объект
Processдля управления подпроцессом - Выбрасывает:
-
UnsupportedOperationException- если операционная система не поддерживает создание процессов. -
IOException- если возникает ошибка ввода-вывода -
NullPointerException- еслиcmdarrayимеет значениеnull, один из элементовcmdarrayимеет значениеnullили один из элементовenvpимеет значениеnull -
IndexOutOfBoundsException- еслиcmdarrayявляется пустым массивом (имеет длину0) - Начиная с версии:
- 1.3
- См. также:
availableProcessors
public int availableProcessors()
Это значение может изменяться во время работы виртуальной машины. Поэтому приложениям, для которых важно количество доступных процессоров, следует время от времени проверять это свойство и соответствующим образом корректировать использование ресурсов.
- Возвращает:
- максимальное количество процессоров, доступных виртуальной машине; не меньше единицы
- Начиная с версии:
- 1.4
freeMemory
public long freeMemory()
gc может привести к увеличению значения, возвращаемого методом freeMemory.
- Возвращает:
- приблизительное количество памяти, доступной в данный момент для будущих выделений под объекты, в байтах.
totalMemory
public long totalMemory()
Обратите внимание, что объём памяти, необходимый для хранения объекта заданного типа, может зависеть от реализации.
- Возвращает:
- общий объём памяти, доступной в данный момент для текущих и будущих объектов, в байтах.
maxMemory
public long maxMemory()
Long.MAX_VALUE.- Возвращает:
- максимальный объём памяти, который виртуальная машина будет пытаться использовать, в байтах
- Начиная с версии:
- 1.4
gc
public void gc()
Вызов этого метода является предложением виртуальной машине Java приложить усилия для освобождения неиспользуемых объектов, чтобы занимаемая ими память стала доступна для повторного использования виртуальной машиной Java. К моменту возврата управления из вызова метода виртуальная машина Java приложит все возможные усилия для освобождения пространства, занятого всеми неиспользуемыми объектами. Нет никаких гарантий, что эти усилия приведут к освобождению какого-либо определённого числа неиспользуемых объектов или определённого объёма памяти либо будут завершены к какому-либо определённому моменту времени — до возврата метода или вообще. Также нет гарантий, что эти усилия позволят определить изменение достижимости для какого-либо определённого числа объектов или что какое-либо определённое число объектов Reference будет очищено и помещено в очередь.
Имя gc означает «сборщик мусора». Виртуальная машина Java автоматически выполняет этот процесс освобождения памяти по мере необходимости в отдельном потоке, даже если метод gc не вызывается явно.
Метод System.gc() является общепринятым и удобным способом вызова этого метода.
runFinalization
@Deprecated(since="18", forRemoval=true) public void runFinalization()
Object.finalize(). При работе в JVM, в которой финализация отключена или удалена, объектов, ожидающих финализации, не будет, поэтому этот метод ничего не делает.
finalize объектов, признанных ненужными, но методы finalize которых ещё не были запущены. К моменту возврата управления из вызова метода виртуальная машина приложит все возможные усилия для завершения всех ожидающих финализации. Виртуальная машина автоматически выполняет процесс финализации по мере необходимости в отдельном потоке, если метод runFinalization не вызывается явно.
Метод System.runFinalization() является общепринятым и удобным способом вызова этого метода.
- См. Спецификацию языка Java:
- 12.6 Финализация экземпляров классов
- См. также:
load
public void load(String filename)
load — это ограниченный метод платформы Java. load только при включённом доступе к ограниченным методам.Runtime.getRuntime().load("/home/avh/lib/libX11.so");). Если аргумент имени файла после удаления любого платформенно-зависимого префикса библиотеки, пути и расширения файла указывает на библиотеку с именем, например, L, а собственная библиотека с именем L статически связана с виртуальной машиной, вызывается экспортированная библиотекой функция JNI_OnLoad_L вместо попытки загрузить динамическую библиотеку. Файл с именем, соответствующим аргументу, не обязательно должен существовать в файловой системе. Дополнительные сведения см. в спецификации JNI. В противном случае аргумент имени файла преобразуется в образ собственной библиотеки способом, зависящим от реализации. Этот метод похож на метод loadLibrary(String)ОГРАНИЧЕННЫЙ, но принимает в качестве аргумента произвольное имя файла, а не только имя библиотеки, что позволяет загружать любой файл с собственным кодом.
Метод System.load(String)ОГРАНИЧЕННЫЙ является общепринятым и удобным способом вызова этого метода.
- Параметры:
-
filename- файл для загрузки. - Выбрасывает:
-
UnsatisfiedLinkError- если имя файла не является абсолютным путём, собственная библиотека не связана статически с виртуальной машиной или главная система не может преобразовать библиотеку в образ собственной библиотеки. -
NullPointerException- еслиfilenameимеет значениеnull -
IllegalCallerException- если вызывающий код находится в модуле, для которого не включён доступ к собственному коду. - Внешние спецификации
- См. также:
loadLibrary
public void loadLibrary(String libname)
loadLibrary — это ограниченный метод платформы Java. loadLibrary только при включённом доступе к ограниченным методам.libname. Аргумент libname не должен содержать специфичный для платформы префикс, расширение файла или путь. Если нативная библиотека с именем libname статически связана с виртуальной машиной, вызывается экспортируемая библиотекой функция JNI_OnLoad_libname. Подробнее см. в спецификации JNI. В противном случае библиотека, заданная аргументом libname, загружается из системного расположения библиотек и отображается в образ нативной библиотеки способом, зависящим от реализации. Метод System.loadLibrary(String)ОГРАНИЧЕН — общепринятый и удобный способ вызова этого метода. Если при реализации класса используются нативные методы, стандартная стратегия заключается в том, чтобы поместить нативный код в файл библиотеки (назовём его LibFile), а затем добавить в объявление класса статический инициализатор:
static { System.loadLibrary("LibFile"); }
При загрузке и инициализации класса также будет загружена необходимая реализация нативного кода для нативных методов. Если этот метод вызывается несколько раз с одним и тем же именем библиотеки, второй и последующие вызовы игнорируются.
- Параметры:
-
libname— имя библиотеки. - Исключения:
-
UnsatisfiedLinkError— если аргумент libname содержит путь к файлу, нативная библиотека не связана статически с виртуальной машиной или библиотеку не удаётся отобразить в образ нативной библиотеки средствами хост-системы. -
NullPointerException— еслиlibnameимеет значениеnull -
IllegalCallerException— если вызывающий код находится в модуле, для которого не включён доступ к нативному коду. - Внешние спецификации
version
public static Runtime.Version version()
Runtime.Version.- Возвращает:
Runtime.Version— версию среды выполнения Java- Появился в версии:
- 9
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Runtime.html
exec(String[])илиProcessBuilder.