8034867: Object references from expression stack are not visible as roots via jvmti FollowReferences and HeapDump
Summary: The heap walking is inconsistent without following references from expression stack, so need to fix it
Reviewed-by: coleenp, sspitsyn
Contributed-by: axel.siebenborn@sap.com
--- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp Sun Feb 23 13:16:03 2014 -0500
+++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp Sun Feb 23 22:36:19 2014 -0800
@@ -3081,6 +3081,23 @@
}
}
}
+
+ StackValueCollection* exprs = jvf->expressions();
+ for (int index=0; index < exprs->size(); index++) {
+ if (exprs->at(index)->type() == T_OBJECT) {
+ oop o = exprs->obj_at(index)();
+ if (o == NULL) {
+ continue;
+ }
+
+ // stack reference
+ if (!CallbackInvoker::report_stack_ref_root(thread_tag, tid, depth, method,
+ bci, locals->size() + index, o)) {
+ return false;
+ }
+ }
+ }
+
} else {
blk->set_context(thread_tag, tid, depth, method);
if (is_top_frame) {
--- a/hotspot/src/share/vm/services/heapDumper.cpp Sun Feb 23 13:16:03 2014 -0500
+++ b/hotspot/src/share/vm/services/heapDumper.cpp Sun Feb 23 22:36:19 2014 -0800
@@ -1604,6 +1604,18 @@
}
}
}
+ StackValueCollection *exprs = jvf->expressions();
+ for(int index = 0; index < exprs->size(); index++) {
+ if (exprs->at(index)->type() == T_OBJECT) {
+ oop o = exprs->obj_at(index)();
+ if (o != NULL) {
+ writer()->write_u1(HPROF_GC_ROOT_JAVA_FRAME);
+ writer()->write_objectID(o);
+ writer()->write_u4(thread_serial_num);
+ writer()->write_u4((u4) (stack_depth + extra_frames));
+ }
+ }
+ }
} else {
// native frame
if (stack_depth == 0) {