> On Nov 13, 2015, at 9:55 AM, Daniel Fuchs <[email protected]> wrote:
>
> Hi Mandy,
>
> StackFrameInfo.java:
>
> 100 public OptionalInt getLineNumber() {
> 101 ensureMethodInfoInitialized();
> 102 return lineNumber != -1 ? OptionalInt.of(lineNumber) :
> OptionalInt.empty();
> 103 }
>
> If lineNumber is -2 then empty should probably be returned too.
lineNumber == -2 is used to indicate a native method.
-1 is unavailable.
>
> Which means that the following code code in StackWalker.StackFrame
> would need to be changed accordingly:
>
> 175 public default StackTraceElement toStackTraceElement() {
> 176 return new StackTraceElement(getClassName(), getMethodName(),
> 177 getFileName().orElse(null),
> 178 getLineNumber().orElse(-1));
> 179 }
>
> The other option would be to document -2 as a special value
> in StackFrame.getLineNumber() but that would be ugly?
>
StackTraceElement constructor takes -2 line number for native method.
Mandy
> best regards
>
> -- daniel
>
> -- daniel
>
> On 13/11/15 16:21, Mandy Chung wrote:
>> A revised webrev:
>> http://cr.openjdk.java.net/~mchung/jdk9/jep259/webrev.01
>>
>> javadoc:
>>
>> http://cr.openjdk.java.net/~mchung/jdk9/jep259/api/java/lang/StackWalker.html
>>
>> 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.
>>
>> Mandy
>>
>>
>>> On Nov 9, 2015, at 6:32 PM, Mandy Chung <[email protected]> wrote:
>>>
>>> javadoc:
>>>
>>> http://cr.openjdk.java.net/~mchung/jdk9/jep259/api/java/lang/StackWalker.html
>>>
>>> webrev:
>>> http://cr.openjdk.java.net/~mchung/jdk9/jep259/webrev.00/
>>>
>>> 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
>>
>