从JNI线程调用fork时Java堆会发生什么

时间:2018-08-17 04:37:44

标签: java java-native-interface

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

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

1 个答案:

答案 0 :(得分:1)

调用fork()后,作为子进程的JVM将无法工作。根据{{​​3}}:

  

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

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

请参阅the POSIX documentation on fork(),以获取POSIX必须具有异步信号安全性的功能调用列表。

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