Need help to understand TLS behavior
cheleswer sahu
cheleswer.sahu at oracle.com
Mon Dec 14 10:49:08 UTC 2015
Hi,
I am investigating an issue, in which test with TLS size set to 32K is
failing with StackOverFlowError. During investigation I found the below
code
/jdk8u-cpu <https://java.se.oracle.com/source/xref/jdk8u-cpu/>/jdk
<https://java.se.oracle.com/source/xref/jdk8u-cpu/jdk/>/src
<https://java.se.oracle.com/source/xref/jdk8u-cpu/jdk/src/>/solaris
<https://java.se.oracle.com/source/xref/jdk8u-cpu/jdk/src/solaris/>/classes
<https://java.se.oracle.com/source/xref/jdk8u-cpu/jdk/src/solaris/classes/>/java
<https://java.se.oracle.com/source/xref/jdk8u-cpu/jdk/src/solaris/classes/java/>/lang
<https://java.se.oracle.com/source/xref/jdk8u-cpu/jdk/src/solaris/classes/java/lang/>/UNIXProcess.java
<https://java.se.oracle.com/source/xref/jdk8u-cpu/jdk/src/solaris/classes/java/lang/UNIXProcess.java>
227
<https://java.se.oracle.com/source/xref/jdk8u-cpu/jdk/src/solaris/classes/java/lang/UNIXProcess.java#227> ThreadFactory
<https://java.se.oracle.com/source/s?defs=ThreadFactory&project=jdk8u-cpu> threadFactory
<https://java.se.oracle.com/source/s?defs=threadFactory&project=jdk8u-cpu> =grimReaper
<https://java.se.oracle.com/source/s?defs=grimReaper&project=jdk8u-cpu> -> {
228
<https://java.se.oracle.com/source/xref/jdk8u-cpu/jdk/src/solaris/classes/java/lang/UNIXProcess.java#228> // Our thread stack requirement is quite modest.
229
<https://java.se.oracle.com/source/xref/jdk8u-cpu/jdk/src/solaris/classes/java/lang/UNIXProcess.java#229> Thread <https://java.se.oracle.com/source/s?defs=Thread&project=jdk8u-cpu> t =*new* Thread <https://java.se.oracle.com/source/s?defs=Thread&project=jdk8u-cpu>(systemThreadGroup
<https://java.se.oracle.com/source/s?defs=systemThreadGroup&project=jdk8u-cpu>,grimReaper
<https://java.se.oracle.com/source/s?defs=grimReaper&project=jdk8u-cpu>,
230
<https://java.se.oracle.com/source/xref/jdk8u-cpu/jdk/src/solaris/classes/java/lang/UNIXProcess.java#230> "process reaper",32768);
Here reaper thread is created with fixed stack size "32768 ", which
causes StackOverFlowError when TLS is set to 32k around.
If I remove this fixed size and make it default, test works fine.
Thread <https://java.se.oracle.com/source/s?defs=Thread&project=jdk8u-cpu> t =*new* Thread <https://java.se.oracle.com/source/s?defs=Thread&project=jdk8u-cpu>(systemThreadGroup
<https://java.se.oracle.com/source/s?defs=systemThreadGroup&project=jdk8u-cpu>,grimReaper
<https://java.se.oracle.com/source/s?defs=grimReaper&project=jdk8u-cpu>,
230
<https://java.se.oracle.com/source/xref/jdk8u-cpu/jdk/src/solaris/classes/java/lang/UNIXProcess.java#230> "process reaper");
I have run several test with TLS size 32k , 64k ,128k and more .
The interesting part, it works well with 64k and 128k TLS size but not with 32k.
So my questions are as follows:
> What is the motivation behind the fixed thread stack size ?
> will it be ok to replace the fixed stack size with default or stack size setting is platform sensitive?
> How TLS sizes are interpreted internally, which allows 64k and 128k to work but not to 32k ?
I would really appreciate, if anyone have any opinion on this.
Regards,
Cheleswer
More information about the core-libs-dev
mailing list