Integrated: 8268829: Provide an optimized way to walk the stack with Class object only
Mandy Chung
mchung at openjdk.org
Thu Sep 7 21:40:57 UTC 2023
On Mon, 21 Aug 2023 20:07:20 GMT, Mandy Chung <mchung at openjdk.org> wrote:
> 8268829: Provide an optimized way to walk the stack with Class object only
>
> `StackWalker::walk` creates one `StackFrame` per frame and the current implementation
> allocates one `StackFrameInfo` and one `MemberName` objects per frame. Some frameworks
> like logging may only interest in the Class object but not the method name nor the BCI,
> for example, filters out its implementation classes to find the caller class. It's
> similar to `StackWalker::getCallerClass` but allows a predicate to filter out the element.
>
> This PR proposes to add `Option::DROP_METHOD_INFO` enum that requests to drop the method information. If no method information is needed, a `StackWalker` with `DROP_METHOD_INFO`
> can be used instead and such stack walker will save the overhead of extracting the method information
> and the memory used for the stack walking.
>
> New factory methods to take a parameter to specify the kind of stack walker to be created are defined.
> This provides a simple way for existing code, for example logging frameworks, to take advantage of
> this enhancement with the least change as it can keep the existing function for traversing
> `StackFrame`s.
>
> For example: to find the first caller filtering a known list of implementation class,
> existing code can create a stack walker instance with `DROP_METHOD_INFO` option:
>
>
> StackWalker walker = StackWalker.getInstance(Option.DROP_METHOD_INFO, Option.RETAIN_CLASS_REFERENCE);
> Optional<Class<?>> callerClass = walker.walk(s ->
> s.map(StackFrame::getDeclaringClass)
> .filter(Predicate.not(implClasses::contains))
> .findFirst());
>
>
> If method information is accessed on the `StackFrame`s produced by this stack walker such as
> `StackFrame::getMethodName`, then `UnsupportedOperationException` will be thrown.
>
> #### Javadoc & specdiff
>
> https://cr.openjdk.org/~mchung/api/java.base/java/lang/StackWalker.html
> https://cr.openjdk.org/~mchung/jdk22/specdiff/overview-summary.html
>
> #### Alternatives Considered
> One alternative is to provide a new API:
> `<T> T walkClass(Function<? super Stream<Class<?>, ? extends T> function)`
>
> In this case, the caller would need to pass a function that takes a stream
> of `Class` object instead of `StackFrame`. Existing code would have to
> modify calls to the `walk` method to `walkClass` and the function body.
>
> ### Implementation Details
>
> A `StackWalker` configured with `DROP_METHOD_INFO` option creates `ClassFrameInfo[]`
> buffer that is filled by the VM during stack walking. `Sta...
This pull request has now been integrated.
Changeset: 111ecdba
Author: Mandy Chung <mchung at openjdk.org>
URL: https://git.openjdk.org/jdk/commit/111ecdbaf58e5c0b3a64e0eca8a291df295e71b0
Stats: 1340 lines in 34 files changed: 718 ins; 358 del; 264 mod
8268829: Provide an optimized way to walk the stack with Class object only
8210375: StackWalker::getCallerClass throws UnsupportedOperationException
Reviewed-by: coleenp, dfuchs, bchristi
-------------
PR: https://git.openjdk.org/jdk/pull/15370
More information about the core-libs-dev
mailing list