defender methods analysis, classloading and java.lang.StackOverflowError
Sergey Kuksenko
sergey.kuksenko at oracle.com
Wed Mar 14 08:08:54 PDT 2012
Hi All,
It is not a big secret that HotSpot do classloading of
superclasses/superinterfaces recursively.
That means - for any fixed stack size there is classes/interfaces chain
which causes java.lang.StackOverflowError
For example, on Linux x86-32, chain of 512 interfaces needs at least
2.5Megabytes stack size using jdk7u2 (default stack size == 320k).
Maybe it is not a good idea to do classloading with recursion, but it is
a topic for another mail list.
Let's back to defenders.
I was playing with interface chains. All interfaces (except the first)
are empty. There are no defender methods here.
As result I've got on Linux x86-32:
- jdk7u2 requires ~4.8K per interface
- jdk8 requires ~5K per interface
- lambda build requires ~13K per interface.
Lambda's HotSpot requires 2.5 larger stack size settings than jdk8. This
is really significant change. Jdk7 & 8 with default stack size (Linux32)
may load chain of ~60 classes/interfaces, but lambda may load chain only
of ~20 classes/interfaces. The source of that is declaration
"GenericAnalyzer ga;" in the "ClassFileParser::parseClassFile" method
and it doesn't matter that the declaration is inside never executed
scope/block.
We may say "thank you" to gcc. I didn't check, but expecting the similar
problem for other C++ compilers and platforms.
I've attached patch which solves that problem. Simple extracting couple
lines of code into separate method bring back lambda to jdk8 stack size
requirements.
--
Best regards,
Sergey Kuksenko
More information about the lambda-dev
mailing list