java - 上下文切换的 native 线程无法附加到 JVM

标签 java linux boost java-native-interface

我们有一个 Java 服务器(Linux 64 位)应用程序,它使用 native 代码来处理它的内容。 native 代码还处理所有多线程问题,并且最近通过使用 boost::context 的光纤切换得到了 boost 。

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

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

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

有人知道解决这个问题的方法吗?

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

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

最佳答案

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

根据我的经验,您应该恰好附加一次 native 线程,并在它退出之前恰好分离一次。如果您不知道自己是否已经附加,请使用此代码:

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

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

关于java - 上下文切换的 native 线程无法附加到 JVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092602/

相关文章:

Java 8 Lambda 将函数或变量作为参数传递

java - 模型和 View 404 问题

c - 上游维护者的工具?用于发布前的测试(Debian等)

python - 没有名为组合的模块(来自 import wx.combo) - pyspread

c++ - 如何使用 boost::date_time 解析一年中的几周?

java - 启动画面和第二个 Activity 返回

java - 使用 openEntityManagerInView 仍然得到 "failed to lazily initialize a collection of role"

linux - Linux tmp文件夹中的Rewrite.log超过40G

visual-studio-2010 - tr1:boost vs vs2010,使用没有命名空间的shared_ptr

c++ - boost Range 库会成为下一个 C++ 标准的一部分吗?