0

死ぬことのない4つのワーカースレッドを持つWebサーバーにJVMを埋め込んでいます。次のコードは、4つのワーカーのいずれか内の各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

4

1 に答える 1

0

JNIEnv*をグローバルスコープに入れたようです。それ自体は、使用される各スレッドで上書きされるため、問題を引き起こすことはありませんが、JNIは、使用されるたびに内部的に解放する必要があるように見えます。APIデザインの素晴らしさ!

于 2012-05-01T12:50:29.167 に答える