Зачем вызывать волокно внутри JNI выбрасывает StackOverflow в JVM?

Я думаю, что это сложный вопрос и здесь. В любом случае, я хочу попробовать.

Я реализовал мини-проект JNI, портирующий собственные буст-волокна внутри Java.

Это интерфейс JNI

inline void execute(JNIEnv * env,jobject runnable,jmethodID mid){
cout <<  " 31---"  << endl;
env->CallVoidMethod(runnable, mid);
cout <<  " 32---"  << endl;
}

/*
* Class:     java_ext_concurrent_fiber_NativeFiber
* Method:    run
* Signature: (Ljava/lang/Runnable;)J
*/
JNIEXPORT void JNICALL Java_ext_concurrent_fiber_NativeFiber_run
(JNIEnv * env, jclass clazz, jobject runnable){
cout <<  " 1---"  << endl;
jclass cls = env->GetObjectClass( runnable);
cout <<  " 2---"  << endl;
jmethodID mid = env->GetMethodID( cls, "run", "()V");
cout <<  " 3---"  << endl;

env->CallVoidMethod(runnable, mid);
boost::fibers::fiber fiber(execute,env,runnable,mid);

cout <<  " 3---"  << endl;

}

это тест Java

public class Test {
public static void main(String[] args) throws InterruptedException {

NativeFiber fiber=new NativeFiber(new Runnable() {
@Override
public void run() {System.out.println("hello");
}
});
fiber.start();}
}

Если я выполню этот код

throws StackOverflowException

Если я удаляю fiber.join () и добавляю fiber.detach ();

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f5a37017f1f, pid=16559, tid=0x00007f5a38522700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_131-b11) (build 1.8.0_131-b11)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x6d7f1f]  jni_CallVoidMethodV+0x3f
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /data/git/concurrent/hs_err_pid16559.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp

1

Решение

Возможно, потому что стек Fibers слишком мал для Java.

Однако на самом деле не рекомендуется запускать код JVM / JRE для волокон без явной поддержки.

Если вы обнаружили часть спецификации JVM, которая явно разрешает это, а также вы знаете, что части JRE, от которых вы зависите, безопасны для использования на волокнах, вы, очевидно, можете игнорировать эти слова предостережения

Как это бывает, JVM / JRE может содержать любое количество предположений, основанных на модели потоков. Например, использование локальных потоковых статических экземпляров, безопасных для несинхронизированного доступа. Это нарушит предположение и, следовательно, приведет к неопределенному поведению.

Если вам нужны волокна, посмотрите на JVM-способ их достижения (я не могу представить, что для этого нет популярной библиотеки).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]