Details
-
Improvement
-
Status: Open
-
Major
-
Resolution: Unresolved
-
None
-
None
-
None
-
Patch Available
-
Moderate
Description
During JNI transition the exception flags are checked twice.
1. One check is generated in JNI lil stub (vm/vmcore/src/jit/compile.cpp:675)
//***** Part 11: Rethrow exception
cs = lil_parse_onto_end(cs,
"l0=ts;"
"ld l2,[l0+%0i:ref];"
"jc l2!=0,_exn_raised;"
"ld l2,[l0+%1i:ref];"
"jc l2=0,_no_exn;"
":_exn_raised;"
"m2n_save_all;"
"out platform::void;"
"call.noret %2i;"
":_no_exn;",
eoo, eco, exn_rethrow);
assert(cs);
2. Second check is done during pop_m2n frame generation: (ex.: vm/port/src/lil/ia32/pim/m2n_ia32.cpp:259)
static void m2n_free_local_handles() {
assert(!hythread_is_suspend_enabled());
// AGAIN!
if (exn_raised())
M2nFrame * m2n = m2n_get_last_frame();
free_local_object_handles3(m2n->local_object_handles);
}
So, we might throw away the exception handling from JNI lil stub, as far push_m2n is made always during JNI transition. Much more effective is to throw away blocks from m2n_free_local_handles and m2n_pop_local_handles, but that could affect compatibility across the m2n calls.
Simple JNI test (executing several millions of empty JNI methods) shows:
$ ../../Builds/Harmony-clean/bin/java -cp . -Xmx128m -Xms128m nalog.nalog
iteration: 0 millis:8763
iteration: 1 millis:8722
iteration: 2 millis:8833
$ ../../Builds/Harmony-noEXP/bin/java -cp . -Xmx128m -Xms128m nalog.nalog
iteration: 0 millis:7824
iteration: 1 millis:7845
iteration: 2 millis:7836
$ ../../Builds/Harmony-noEXP-clean/bin/java -cp . -Xmx128m -Xms128m nalog.nalog
iteration: 0 millis:8241
iteration: 1 millis:8255
iteration: 2 millis:8214
Attachments
Attachments
Issue Links
- blocks
-
HARMONY-4704 [drlvm][jni] JNI improvements
- Open