当从JNI线程调用fork时,Java堆会发生什么情况

当从JNI线程调用fork时,Java堆会发生什么情况,java,java-native-interface,Java,Java Native Interface,当从JNI线程调用fork()时,Java堆会发生什么情况。Java堆是重复的吗 本机内存部分、JNI内存、类内存、线程内存和线程本地堆(TLH)会发生什么情况?调用fork()后,JVM作为子进程将无法工作。Per: 应使用单个线程创建进程。如果是多线程 进程调用fork(),新进程应包含 调用线程及其整个地址空间,可能包括 互斥体和其他资源的状态。因此,为了避免错误, 在调用exec函数之前,子进程只能执行异步信号安全操作。 JVM是一个多线程进程,JNI调用和Java函数不是POSIX异步

当从JNI线程调用
fork()
时,Java堆会发生什么情况。Java堆是重复的吗

本机内存部分、JNI内存、类内存、线程内存和线程本地堆(TLH)会发生什么情况?

调用
fork()
后,JVM作为子进程将无法工作。Per:

应使用单个线程创建进程。如果是多线程 进程调用fork(),新进程应包含 调用线程及其整个地址空间,可能包括 互斥体和其他资源的状态。因此,为了避免错误, 在调用
exec
函数之前,子进程只能执行异步信号安全操作。

JVM是一个多线程进程,JNI调用和Java函数不是POSIX异步信号安全函数调用

有关POSIX要求异步信号安全的函数调用列表,请参阅


那么,Java堆和其他JVM特定内存会发生什么变化?它们被复制到子进程的虚拟地址空间,通常是通过,但是如果您尝试在子进程中继续执行JVM,它们实际上是不可用的。例如,它们处于未知状态,锁可能由不存在的线程持有。

根据
fork(2)
手册页面,我希望复制地址空间。但我不希望子进程是一个功能性JVM。。。因为(例如)分叉不会复制子进程中的父进程线程。由于每个JVM都有/需要多个线程,因此这是一个阻碍因素。@StephenC父进程中活动的Java线程会发生什么情况,所有Java线程都不会运行?正确(除了名为
fork
的线程)。更糟糕的是,您将丢失GC线程。我预计孩子会严重受伤,甚至会出现紧张症。但是你可以试一下。。。看看会发生什么。