2012-05-01 34 views
0

我正在将JVM嵌入到具有4个永不死亡的工作线程的Web服务器中。下面的代码在4个中的一个的任何工人内每个HTTP请求运行:多线程JNI导致负载下的段错误

// 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

回答

0

貌似我已经把JNIEnv的*到全球范围。虽然这本身不应该引起任何问题,因为它在被使用的每个线程中被覆盖,看起来好像JNI每次使用时都需要内部释放它。 API设计的奇迹!

+1

当然,使它成为全球性问题。每个线程都需要自己的价值。如果它是全球性的,他们可以使用彼此的价值观。 – EJP

+0

啊对,因为整个过程中全局变量只存在一次。我有一个脑冻结,告诉我每个线程都有自己的副本。 – Blub