上下文切换的本机线程无法附加到JVM

Nee*_*eet 5 java linux java-native-interface boost

我们有一个Java服务器(Linux 64位)应用程序,它使用本机代码进行处理.本机代码还处理所有多线程问题,并且最近使用光纤交换进行了增强boost::context.

我们现在面临的问题是AttachCurrentThread光纤交换线程失败了.经过一些长时间的调试和测试后,我们找到了原因:JVM似乎拒绝了与创建时不同的堆栈指针的线程.

我们通过简单地从具有修改(但有效)的pthread附加到JVM来验证这一点,该pthread rsprsp被修改时失败.

一个可能的修复方法会引入某种事件处理机制来将回调与光纤交换线程分离,但我真的想避免这种情况.

有人知道解决方法吗?

是否可以禁用堆栈检查(Oracle Java 1.7.0_40,64位)?

我们可以修改本机pthreads以指向正确的堆栈帧(我怀疑我们可以)吗?(我们不能提前设置堆栈帧).

Whe*_*zil 0

免责声明:这并不是一个真正的答案,因为我没有直接解决 RSP 切换问题,但它太长了,无法发表评论。

根据我的经验,您应该仅附加一次本机线程,并在退出之前仅分离一次。如果您不知道是否已附加,请使用以下代码:

jint rv = vm->GetEnv((void**)&env, JNI_VERSION_1_6);
if (rv == JNI_EDETACHED) {
    vm->AttachCurrentThread((void**)&env, 0);
}
Run Code Online (Sandbox Code Playgroud)

我建议首先,确保在创建任何关联的纤程之前准确地附加到线程一次,并在每个本机线程退出之前准确地分离一次(或者根本不分离,如果本机线程没有终止)。