RFR: JDK-8219412: Eager enum class initialization with enum switch

Jan Lahoda jan.lahoda at oracle.com
Tue Apr 9 15:23:18 UTC 2019


On 9.4.2019 13:58, Claes Redestad wrote:
> Hi Jan,
>
> On 2019-04-09 12:32, Jan Lahoda wrote:
>> For OpenJDK, there are ~150 additional classes (from 30267 to 30415)
>> with the .00 version of the patch.
>
> to me it sounds those additional classes will mostly be the result of
> splitting existing classes, so the static and potential runtime
> footprint overheads are small. And .01 seems to add a BSM for every
> enum switch, so while we reduce compiled classes we add other
> overheads.
>
> I think it'd be good, for the sake of argument, to examine the exact
> size of lib/modules with baseline, .00, and .01. My gut feeling is the
> gain from the approach in .01 is smaller than it first appears.

So, I think the outcomes are more interesting than I expected. I ran:
find . -name "*.class" | wc -l
and
find . -name "*.class" | xargs cat | wc -c

For the exploded JDK images with version .00 and .01 of the patch and 
unmodified.

Unmodified: 134400902 bytes, 30267 classes, jdk.compiler size: 7746387b
patch .00:  134476598 bytes, 30412 classes, jdk.compiler size: 7777182b
patch .01:  134637774 bytes, 30270 classes, jdk.compiler size: 7806442b

So, with the .01 patch, the total size seems to be bigger than with the 
.00 patch. This is partly because there is more code in javac 
(jdk.compiler), but I also took a look at a few classes:
with patch version .00:
jdk/modules/java.base/java/lang/invoke/VarHandle$2.class:
933 bytes

jdk/modules/java.base/java/lang/invoke/VarHandle$3.class:
914 bytes

jdk/modules/java.base/java/lang/invoke/VarHandle$VarHandleDesc.class: 
4427 bytes

with patch version .01:
jdk/modules/java.base/java/lang/invoke/VarHandle$2.class:
1847 bytes

jdk/modules/java.base/java/lang/invoke/VarHandle$VarHandleDesc.class:
4553 bytes

(the VarHandle$2.class here contains code that is in VarHandle$2.class 
and VarHandle$3.class with patch version .00)

The difference in the VarHandle$VarHandleDesc.class appears to be mostly 
the difference in describing the bootstrap method. It is true currently 
the generated bootstrap's name is fairly long, so with a shorter name, 
the difference would be smaller, and version .01 might get even smaller 
than version .00 (I didn't measure/try that (yet)).

So I think you are right that the gain with .01 is probably much smaller 
than it might appear.

Jan

>
> (That said I think there is intrinsic value in exploring and using
> condy for things like this.)
>
> Thanks!
>
> /Claes


More information about the compiler-dev mailing list