-
JEP
-
Resolution: Delivered
-
P2
-
Christian Thalinger
-
Feature
-
Open
-
Implementation
-
-
M
-
M
-
210
Summary
Reduce LambdaForm creation and use caching to improve the performance of dynamic languages.
Goals
Considerably reduce memory footprint while preserving current peak-performance metrics.
Motivation
Many method-handle transforms (e.g., MethodHandles::filterReturnValue
)
create many new LambdaForm instances for each transformed method handle.
This induces excessive memory usage in applications that make heavy use
of method handles.
Description
The current method-handle implementation instantiates LambdaForms too
aggressively. The proposed approach is two-fold: Share LambdaForm
instances and their bytecodes for similar transformations, and cache
lambda forms for different combinators on a per-basic-type basis (see
MethodTypeForm.lambdaForms
).
Testing
Existing tests give good coverage of functionality. Some focused tests (i.e., white-box tests verifying actual sharing in different cases) are also desirable.
Existing tests:
jdk/test/java/{lang/invoke,util/stream}
- mlvm tests
- Nashorn unit tests
- ECMA test262
- Octane benchmarks
Testing modes:
- out-of-box: no flags
- assertions:
-ea -esa
- interpreted vs. compiled LFs:
-Djava.lang.invoke.MethodHandle.COMPILE_THRESHOLD={0,30}
.
Risks and Assumptions
The implementation shouldn't cause any regression in peak performance.
Experiments show, however, that preserving peak performance may prevent
maximal sharing in some situations (e.g., MethodHandles.guardWithTest
,
where profile pollution due to sharing distorts inlining decisions of JIT
compiler). We'll need to find a suitable balance between footprint
reduction and peak performance during development.
Impact
The changes are concentrated in Java portion of the method-handle
implementation (i.e., the java.lang.invoke
and sun.invoke
packages).
There is no impact upon those who don't use method handles. No new APIs
will be added and no existing APIs will be changed.
- duplicates
-
JDK-8024840 OOME on JRuby tests
- Closed
-
JDK-8038586 OOME on JRuby tests
- Closed
-
JDK-8024840 OOME on JRuby tests
- Closed
-
JDK-8038586 OOME on JRuby tests
- Closed
- relates to
-
JDK-8057020 LambdaForm caches should support eviction
- Closed
-
JDK-8063135 Enable full LF sharing by default
- Closed
-
JDK-8069591 Customize LambdaForms which are invoked using MH.invoke/invokeExact
- Closed
-
JDK-8057719 New tests for LambdaForm Reduction and Caching feature
- Resolved
-
JDK-8057707 [TEST_BUG] Test library enhancement in lib/testlibrary/jsr292/com/oracle/testlibrary/jsr292/Helper.java
- Resolved