从JNI线程调用fork()时,Java堆会发生什么情况。 Java堆是否重复?
本机内存部分,JNI内存,类内存,线程内存(TLH)线程本地堆会发生什么?
答案 0 :(得分:1)
调用fork()
后,作为子进程的JVM将无法工作。根据{{3}}:
应使用单个线程创建一个进程。如果是多线程 流程调用
fork()
,新流程应包含以下内容的副本: 调用线程及其整个地址空间,可能包括 互斥锁和其他资源的状态。因此,为避免错误, 在调用exec
函数之一之前,子进程只能执行异步信号安全操作。
JVM是一个多线程进程,并且JNI调用和Java函数不是POSIX异步信号安全函数调用。
请参阅the POSIX documentation on fork()
,以获取POSIX必须具有异步信号安全性的功能调用列表。
那么,Java堆和其他特定于JVM的内存将如何处理?它们通常通过2.4 Signal Concepts复制到子进程的虚拟地址空间中,但是如果您尝试在子进程中继续执行JVM,它们实际上是不可用的。它们处于未知状态,例如,锁可能由不存在的线程持有。