|
Relates :
|
|
|
Relates :
|
|
|
Relates :
|
I got a crash running JBB under the collector.
On inspection of the crash log, I found that the code in forte.cpp which validates the Lmethod of an interpreter frame is not cautious enough.
static inline bool forte_is_valid_method(methodOop method) {
if (method == NULL ||
// The methodOop is extracted via an offset from the current
// interpreter frame. With AsyncGetCallTrace() the interpreter
// frame may still be under construction so we need to make
// sure that we got an aligned oop before we try to use it.
!Space::is_aligned(method) ||
!Universe::heap()->is_in_reserved((void*)method) ||
// See if GC became active after we entered AsyncGetCallTrace()
// and before we try to use the methodOop. This routine is
// used in validation of the top_frame so we don't have any
// other data to flush if we bail due to GC here.
// Yes, there is still a window after this check and before
// we use methodOop below, but we can't lock out GC so that
// has to be an acceptable risk.
Universe::heap()->is_gc_active() ||
// klass() does not need vtable dispatch so check before is_perm()
oop(method)->klass() != Universe::methodKlassObj() ||
!method->is_perm() ||
!method->is_method()) {
return false; // doesn't look good
}
return true; // hopefully this is a method indeed
}
In the above method, the is_perm call must come before the klass check.
If not, you can get a method pointing into the unmapped part of the heap's reserved area (e.g., a very high address just within bounds), and the instruction which loads the class will SEGV. This is what happened to me.
(You should remove the comment about a vtable, which appears to be a thoughtless and useless optimization. Nobody cares which order the tests come in, since in most cases both tests are going to be run, since most frame collection attempts are successful.)
|