【发布时间】:2017-04-27 06:52:11
【问题描述】:
下面是在 C 和 Java 进程之间桥接 Linux MQ 的 JNI 代码。虽然我已经发布了所有的 ArrayElements,但是 top 命令的 VIRT 仍然显示出巨大的价值。最大堆大小设置为 2GB,但顶部显示 VIRT 在执行 100 小时后为 10GB。对我来说,这看起来像是内存泄漏,但是,我无法弄清楚 JNI 代码的哪一部分导致了问题。如果有人可以在这方面帮助我,那就太好了。谢谢。
我的 JDK 版本是 1.8.0_91
这是我写的mq_receive方法
JNIEXPORT int JNICALL Java_test_ipc_impl_LinuxMessageQueue_mq_1receive(
JNIEnv *env, jobject self, jint mqdes, jbyteArray buffer, jint msglen) {
jbyte* buf = (*env)->GetByteArrayElements(env, buffer, NULL);
if ((*env)->ExceptionCheck(env))
return -1;
struct timespec timeout;
clock_gettime(CLOCK_REALTIME, &timeout);
timeout.tv_sec += 1;
int size = mq_timedreceive(mqdes, (char*) buf, msglen, 0, &timeout);
if (size == -1) {
if (errno == ETIMEDOUT) {
size = 0;
} else {
perror("mq_receive fail");
}
} else {
(*env)->SetByteArrayRegion(env, buffer, 0, size, buf);
if ((*env)->ExceptionCheck(env))
return -1;
}
(*env)->ReleaseByteArrayElements(env, buffer, buf, JNI_COMMIT);
if ((*env)->ExceptionCheck(env))
return -1;
return size;
}
而且,这是我写的 mq_send 方法
JNIEXPORT void JNICALL Java_test_ipc_impl_LinuxMessageQueue_mq_1send(
JNIEnv *env, jobject self, jint mqdes, jbyteArray buffer, jint msglen) {
jbyte* buf = (*env)->GetByteArrayElements(env, buffer, NULL);
if ((*env)->ExceptionCheck(env))
return;
if (mq_send(mqdes, (char*) buf, msglen, 0) == -1) {
perror("mq_send fail");
}
(*env)->ReleaseByteArrayElements(env, buffer, buf, JNI_COMMIT);
if ((*env)->ExceptionCheck(env))
return;
}
【问题讨论】:
标签: java c java-native-interface ipc