Code Review for JEP 259: Stack-Walking API

Mandy Chung mandy.chung at
Fri Nov 13 15:21:16 UTC 2015

A revised webrev:


The main change in this version is mostly in the hotspot change to incorporate Coleen’s suggestion:
1. Move the new Klasses to systemDictionary as well known classes.
2. Cache the doStackWalker method
3. Move StackFrameInfo::mid, version, cpref fields as VM injected fields as they are not needed by Java.
These fields are interim for performance measurement to compare the cost of MemberName initialization.

The microbenchmark running StackWalker::walk shows 3-4.5X slower due to the use of MemberName.  I suspect the overhead might be due to the MemberName initialization has to handle unresolved and unlinked methods.  For stack walker, the method has been linked and it may be a low hanging fruit to fix in the VM.

4. Updates the javadoc of StackWalker::getCallerClass to reflect filtering of reflection and MethodHandle frames.

Open question:
- is it useful to have an option to configure filtering/showing java.lang.invoke frames?   A user can filter it themselves and I don’t think it’s highly needed and we can add it in the future if needed.


> On Nov 9, 2015, at 6:32 PM, Mandy Chung <mandy.chung at> wrote:
> javadoc:
> webrev:
> Overview of the implementation:
> When stack walking begins, the StackWalker calls into the VM to anchor a native frame (callStackWalk) that will fetch the first batch of stack frames.  VM will then invoke the doStackWalk method so that the consumer starts getting StackFrame object for each frame.  If all frames in the current batch are traversed, it will ask the VM to fetch the next batch.  The library side is doing the filtering of reflection frames.   For this patch, the VM filters of the hidden frames and also filter out Throwable::init related frames for stack trace.
> Ultimately we will move to these built-in logic out from the VM to the library but I’d like to separate them as future works.
> This patch also includes the change for Throwable to use StackWalker but it’s disabled by default.  To enable it, set -Dstackwalk.newThrowable=true.  The VM backtrace is well tuned for performance.  So we separate the switch of Throwable to use StackWalker as a follow-on work:
>   JDK-8141239 Throwable should use StackWalker API to capture the backtrace
> MemberName initialization is one source of overhead and we propose to keep the VM flag -XX:-MemberNameInStackFrame for the time being for the performance work to continue for JDK-8141239.  
> Thanks
> Mandy

More information about the core-libs-dev mailing list