多线程JNI在负载下导致段错误

时间:2012-05-01 12:09:51

标签: c java-native-interface

我正在将一个JVM嵌入到我的网络服务器中,该网络服务器有4个永不消亡的工作线程。以下代码在4个worker中的任何一个内的每个http请求上运行:

// normally I would do URL routing here first, but this is just a JNI test now 
jclass cls;
jmethodID method;
jobjectArray args;
jclass stringClass;
jstring jstr;

(*jvm)->AttachCurrentThread (jvm, &env, NULL);

cls = (*env)->FindClass(env, "HelloWorldClass");

method = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");

jstr = (*env)->NewStringUTF(env, "Hello world!");

stringClass = (*env)->FindClass(env, "java/lang/String");
args = (*env)->NewObjectArray(env, 1, stringClass, jstr);

(*env)->CallStaticVoidMethod(env, cls, method, args);

当我使用调试器时,它可以工作。但是当我使用weighttp基准测试对其施加一些负载时,它会在FindClass()行或CallSTaticVoidMethod()行上随机进行段错误。可能是什么问题呢?我读了很多文档,我不知道如何在这里锁定或释放任何东西。

这几乎是最基本的JNI代码,可以从官方文档中继承:http://java.sun.com/docs/books/jni/html/invoke.html

1 个答案:

答案 0 :(得分:0)

看起来我已将JNIEnv *置于全球范围内。虽然它本身不应该引起问题,因为它在每个使用它的线程中被覆盖,看起来好像JNI希望/需要在每次使用它时在内部释放它。 API设计的奇迹!