Duplicate :
|
|
Duplicate :
|
|
Duplicate :
|
|
Duplicate :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
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.
|