# HG changeset patch # User sspitsyn # Date 1393223779 28800 # Node ID dcca80b5e7e797329935fe7f65e5bd89c115dc60 # Parent bb9356ec5967fbe90d8af9ac872f98619162ec27 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 diff -r bb9356ec5967 -r dcca80b5e7e7 src/share/vm/prims/jvmtiTagMap.cpp --- a/src/share/vm/prims/jvmtiTagMap.cpp Sun Feb 23 13:16:03 2014 -0500 +++ b/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) { diff -r bb9356ec5967 -r dcca80b5e7e7 src/share/vm/services/heapDumper.cpp --- a/src/share/vm/services/heapDumper.cpp Sun Feb 23 13:16:03 2014 -0500 +++ b/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) {