6

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

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

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

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

有人知道解决方法吗?

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

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

4

1 回答 1

0

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

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

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

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

于 2017-03-01T17:10:29.810 回答