> On Nov 18, 2015, at 1:01 PM, Coleen Phillimore <coleen.phillim...@oracle.com> 
> wrote:
> 
> 
> One of the things that I'm struggling with is that StackFrameInfo contains 
> both the collected information from walking the stack frames, method id, bci, 
> mirror, version and cpref, and the digested information: interned string for 
> class name, method name, line number and source file name.
> 

method id, mirror, version and cpref are injected in StackFrameInfo.  I hope 
there is a way to make it conditional only if -XX:-MemberNameInThrowable is set 
(is it possible?)

-XX:-MemberNameInThrowable is temporary and disabled by default.  It is used 
for follow-on performance improvement as we discussed previously.   I still 
believe that there may be some low hanging fruit to reduce the initialization 
of MemberName for an already-linked method.    We should aim to remove this 
flag in JDK 9 so that StackFrameInfo will have only MemberName and bci.

The interned string for class name, method name, line number and source file 
name are requested lazily when StackFrame::getMethodName or other methods are 
called.  They are not eagerly allocated.

> If this is to replace stack walking for exceptions, this will more than 
> double the footprint of the information collected but rarely used. I don't 
> understand why the digested information isn't still StackFrameElement?
> 

If Throwable uses StackWalker, I expect it to use MemberName and 
-XX:-MemberNameInThrowable should be removed by that time.   Also VM no longer 
needs to fill in StackTraceElement as it should fill in StackFrameInfo.   
java_lang_StackTraceElement in javaClasses.[hc]pp can be removed at an 
appropriate time :)

Throwable backtrace will keep an array of StackFrameInfo, one element per 
frame.  StackFrameInfo only captures the MemberName + bci.  When 
Throwable::getStackTraceElements() or printStackTrace() is called, the VM will 
allocate the intern strings for those names and fill in StackFrameInfo.  Then 
convert them to StackTraceElement[] and throw away StackFrameInfo[].   This is 
just the current implementation.   I expect further optimization can be done in 
the JDK side about StackTraceElement and StackFrameInfo.

> That's just a high level comment.  I haven't read the java code yet for the 
> rationale why this type is used for two different things.
> 

The way I implement it is to prepare Throwable backtrace + StackTraceElement be 
replaced by StackFrameInfo in the VM.

The VM fills in StackFrameInfo for StackWalker.   When Throwable switches to 
use StackWalker, VM doesn’t need to know anything about StackTraceElement.

Mandy


Reply via email to