Что происходит с кучей Java при вызове fork из потока JNI

Что происходит с кучей Java, когда fork() вызывается из потока JNI. Куча Java дублируется?

Что будет с собственными разделами памяти, памятью JNI, памятью классов, локальной памятью потоков (TLH)?

1 ответ

После звонка fork(), JVM как дочерний процесс не будет работать. Согласно документации POSIX по fork():

Процесс должен быть создан с одним потоком. Если многопоточный процесс вызывает fork() новый процесс должен содержать копию вызывающего потока и всего его адресного пространства, возможно, включая состояния мьютексов и других ресурсов. Следовательно, чтобы избежать ошибок, дочерний процесс может выполнять только асинхронно-безопасные операции до тех пор, пока один из exec функции называется.

JVM - это многопоточный процесс, и вызовы JNI и функции Java не являются вызовами функций, безопасных для асинхронных сигналов POSIX.

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

Итак, что происходит с кучей Java и другой специфичной для JVM памятью? Они копируются в виртуальное адресное пространство дочернего процесса, обычно с помощью копирования при записи, но их практически невозможно использовать, если вы попытаетесь продолжить выполнение JVM в дочернем процессе. Они находятся в неизвестном состоянии, например, с блокировками, потенциально удерживаемыми несуществующими потоками.

Другие вопросы по тегам