[英]What happens to Java heap when fork is called from JNI thread
从 JNI 线程调用fork()
时 Java 堆会发生什么。 Java 堆是否重复?
本机内存部分、JNI 内存、类内存、线程内存和线程本地堆 (TLH) 会发生什么?
调用fork()
,作为子进程的 JVM 将无法工作。 根据fork()
上的 POSIX 文档:
进程应使用单个线程创建。 如果多线程进程调用
fork()
,则新进程应包含调用线程及其整个地址空间的副本,可能包括互斥锁和其他资源的状态。 因此,为了避免错误,子进程可能只执行异步信号安全操作,直到调用exec
函数之一。
JVM 是一个多线程进程,JNI 调用和 Java 函数不是 POSIX 异步信号安全函数调用。
有关 POSIX 要求异步信号安全的函数调用列表,请参阅2.4 信号概念。
那么,Java 堆和其他特定于 JVM 的内存会发生什么? 它们通常通过copy-on-write复制到子进程的虚拟地址空间中,但是如果您尝试在子进程中继续 JVM 执行,它们实际上是不可用的。 例如,它们处于未知状态,锁定可能由不存在的线程持有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.