8046919: jni_PushLocalFrame OOM - increase MAX_REASONABLE_LOCAL_CAPACITY

Increase the previous limit from 4k to 64k, added "-XX:MaxJNILocalCapacity=<capacity>" flag

Reviewed-by: hseigel, fparain
This commit is contained in:
David Simms 2014-07-14 10:52:52 +02:00
parent 23b30dee7e
commit e5b71580fb
2 changed files with 9 additions and 11 deletions

View File

@ -247,15 +247,6 @@ void jfieldIDWorkaround::verify_instance_jfieldID(Klass* k, jfieldID id) {
"Bug in native code: jfieldID offset must address interior of object");
}
// Pick a reasonable higher bound for local capacity requested
// for EnsureLocalCapacity and PushLocalFrame. We don't want it too
// high because a test (or very unusual application) may try to allocate
// that many handles and run out of swap space. An implementation is
// permitted to allocate more handles than the ensured capacity, so this
// value is set high enough to prevent compatibility problems.
const int MAX_REASONABLE_LOCAL_CAPACITY = 4*K;
// Wrapper to trace JNI functions
#ifdef ASSERT
@ -741,7 +732,8 @@ JNI_ENTRY(jint, jni_PushLocalFrame(JNIEnv *env, jint capacity))
HOTSPOT_JNI_PUSHLOCALFRAME_ENTRY(env, capacity);
//%note jni_11
if (capacity < 0 || capacity > MAX_REASONABLE_LOCAL_CAPACITY) {
if (capacity < 0 ||
((MaxJNILocalCapacity > 0) && (capacity > MaxJNILocalCapacity))) {
HOTSPOT_JNI_PUSHLOCALFRAME_RETURN((uint32_t)JNI_ERR);
return JNI_ERR;
}
@ -844,7 +836,8 @@ JNI_LEAF(jint, jni_EnsureLocalCapacity(JNIEnv *env, jint capacity))
HOTSPOT_JNI_ENSURELOCALCAPACITY_ENTRY(env, capacity);
jint ret;
if (capacity >= 0 && capacity <= MAX_REASONABLE_LOCAL_CAPACITY) {
if (capacity >= 0 &&
((MaxJNILocalCapacity <= 0) || (capacity <= MaxJNILocalCapacity))) {
ret = JNI_OK;
} else {
ret = JNI_ERR;

View File

@ -1216,6 +1216,11 @@ class CommandLineFlags {
product(bool, UseFastJNIAccessors, true, \
"Use optimized versions of Get<Primitive>Field") \
\
product(intx, MaxJNILocalCapacity, 65536, \
"Maximum allowable local JNI handle capacity to " \
"EnsureLocalCapacity() and PushLocalFrame(), " \
"where <= 0 is unlimited, default: 65536") \
\
product(bool, EagerXrunInit, false, \
"Eagerly initialize -Xrun libraries; allows startup profiling, " \
"but not all -Xrun libraries may support the state of the VM " \