Hi Peter,
nice catch:
http://cr.openjdk.java.net/~redestad/8142334/webrev.02
/Claes
On 2015-11-09 20:26, Peter Levart wrote:
Hi Claes,
I see you apply this pattern consistently:
private static NamedFunction getConstantFunction(int idx) {
NamedFunction function = FUNCTIONS[idx];
if (function != null) {
return function;
}
return makeConstantFunction(idx);
}
private static NamedFunction makeConstantFunction(int idx) {
try {
switch (idx) {
case NF_internalMemberName:
return setCachedFunction(idx, new
NamedFunction(DirectMethodHandle.class
.getDeclaredMethod("internalMemberName", Object.class)));
...
You could move a repeatable call to setCachedFuncion from individual
cases of makeConstantFunction to getConstantFunction:
private static NamedFunction getConstantFunction(int idx) {
NamedFunction function = FUNCTIONS[idx];
if (function != null) {
return function;
}
return setCachedFunction(idx, makeConstantFunction(idx));
}
private static NamedFunction makeConstantFunction(int idx) {
try {
switch (idx) {
case NF_internalMemberName:
return new
NamedFunction(DirectMethodHandle.class.getDeclaredMethod("internalMemberName",
Object.class));
...
Regards, Peter
On 11/09/2015 06:51 PM, Claes Redestad wrote:
Hi,
across java.lang.invoke there are a number of inner Lazy classes
whose purpose is to defer initialization of various internally used
NamedFunctions and MethodHandles until first usage. The issue is that
once *any* function or handle in these classes are referenced they're
all initialized, which somewhat defeats the purpose.
By moving to per-MethodHandle and per-NamedFunction lazy
initialization, similar to existing code in
java.lang.invoke.Invokers, we improve the laziness generally: for a
jigsaw Hello World the number of LambdaForms created drops from 74 to
46, reducing heap occupancy for a minimal application and measurably
improving startup time.
Webrev: http://cr.openjdk.java.net/~redestad/8142334/webrev.01
Bug: https://bugs.openjdk.java.net/browse/JDK-8142334
/Claes