[#2623] Release local references to guard against StackOverflow in JNI
Motivation: When we do a (env*)->GetObjectArrayElement(...) call we may created many local references which will only be cleaned up once we exist the native method. Thus a lot of memory can be used and so a StackOverFlow may be triggered. Beside this the JNI specification only say that an implementation must cope with 16 local references. Modification: Call (env*)->ReleaseLocalRef(...) to release the resource once not needed anymore. Result: Less memory usage and guard against StackOverflow
This commit is contained in:
parent
9594a81b95
commit
23840b76d7
@ -740,6 +740,12 @@ JNIEXPORT jlong JNICALL Java_io_netty_channel_epoll_Native_writev(JNIEnv * env,
|
||||
iov[iovidx].iov_base = buffer + pos;
|
||||
iov[iovidx].iov_len = (size_t) (limit - pos);
|
||||
iovidx++;
|
||||
|
||||
// Explicit delete local reference as otherwise the local references will only be released once the native method returns.
|
||||
// Also there may be a lot of these and JNI specification only specify that 16 must be able to be created.
|
||||
//
|
||||
// See https://github.com/netty/netty/issues/2623
|
||||
(*env)->DeleteLocalRef(env, bufObj);
|
||||
}
|
||||
jlong res = writev0(env, clazz, fd, iov, length);
|
||||
if (res <= 0) {
|
||||
@ -759,6 +765,11 @@ JNIEXPORT jlong JNICALL Java_io_netty_channel_epoll_Native_writev(JNIEnv * env,
|
||||
incrementPosition(env, bufObj, len);
|
||||
written -= len;
|
||||
}
|
||||
// Explicit delete local reference as otherwise the local references will only be released once the native method returns.
|
||||
// Also there may be a lot of these and JNI specification only specify that 16 must be able to be created.
|
||||
//
|
||||
// See https://github.com/netty/netty/issues/2623
|
||||
(*env)->DeleteLocalRef(env, bufObj);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@ -776,6 +787,12 @@ JNIEXPORT jlong JNICALL Java_io_netty_channel_epoll_Native_writevAddresses(JNIEn
|
||||
iov[iovidx].iov_base = memoryAddress + readerIndex;
|
||||
iov[iovidx].iov_len = (size_t) (writerIndex - readerIndex);
|
||||
iovidx++;
|
||||
|
||||
// Explicit delete local reference as otherwise the local references will only be released once the native method returns.
|
||||
// Also there may be a lot of these and JNI specification only specify that 16 must be able to be created.
|
||||
//
|
||||
// See https://github.com/netty/netty/issues/2623
|
||||
(*env)->DeleteLocalRef(env, addressEntry);
|
||||
}
|
||||
|
||||
jlong res = writev0(env, clazz, fd, iov, length);
|
||||
|
Loading…
Reference in New Issue
Block a user