RFR 8150778: Reduce Throwable.getStackTrace() calls to the JVM
Coleen Phillimore
coleen.phillimore at oracle.com
Thu Mar 3 00:03:33 UTC 2016
Freshly tested changes with jck tests, with missing checks and other
changes to use the depth field, as pointed out by Aleksey. I've kept
the StackTraceElement[] allocation in Java to match the new API that was
approved.
open webrev at http://cr.openjdk.java.net/~coleenp/8150778.02_hotspot/
open webrev at http://cr.openjdk.java.net/~coleenp/8150778.02_jdk/
Thanks,
Coleen
On 3/2/16 2:57 PM, Coleen Phillimore wrote:
>
>
> On 3/2/16 1:58 PM, Aleksey Shipilev wrote:
>> Hi Coleen,
>>
>> On 03/02/2016 09:44 PM, Coleen Phillimore wrote:
>>> Summary: replace JVM_GetStackTraceDepth and JVM_GetStackTraceElement,
>>> with JVM_GetStackTraceElements that gets all the elements in the
>>> StackTraceElement[]
>>>
>>> These improvements were found during the investigation for replacing
>>> Throwable with the StackWalkAPI. This change also adds iterator for
>>> BacktraceBuilder to make changing format of backtrace easier.
>>>
>>> Tested with -testset core, RBT nightly hotspot nightly tests on all
>>> platforms, and jck tests on linux x64. Compatibility request is
>>> approved.
>>>
>>> open webrev at http://cr.openjdk.java.net/~coleenp/8150778_jdk/
>>> open webrev at http://cr.openjdk.java.net/~coleenp/8150778_hotspot
>>> bug link https://bugs.openjdk.java.net/browse/JDK-8150778
>> Looks interesting!
>>
>> Is there an underlying reason why we can't return the pre-filled
>> StackTraceElements[] array from the JVM_GetStackTraceElements to begin
>> with? This will avoid leaking StackTraceElement constructor into
>> standard library, *and* allows to make StackTraceElement fields final.
>> Taking stuff back from the standard library is hard, if not impossible,
>> so we better expose as little as possible.
>
> We measured that it's faster to allocate the StackTraceElement array
> in Java and it seems cleaner to the Java guys.
> It came from similar code we've been prototyping for StackFrameInfo.
>>
>> Other minor nits:
>>
>> * Initializing fields to their default values is a code smell in Java:
>> private transient int depth = 0;
>
> ok, not sure what "code smell" means but it doesn't have to be
> initialized like this. It's set in the native code.
>>
>> * Passing a null array to getStackTraceElement probably SEGVs? I don't
>> see the null checks in native parts.
>
> Yes, it would SEGV. I'll add some checks for null and make sure it's
> an array of StackTraceElement.
>
> Thanks,
> Coleen
>>
>> Thanks,
>> -Aleksey
>>
>
More information about the hotspot-runtime-dev
mailing list