RFR: 8170307: Stack size option -Xss is ignored

David Holmes david.holmes at oracle.com
Fri Nov 25 10:38:39 UTC 2016


Bug: https://bugs.openjdk.java.net/browse/JDK-8170307

The bug is not public unfortunately for non-technical reasons - but see 
my eval below.

Background: if you load the JVM from the primordial thread of a process 
(not done by the java launcher since JDK 6), there is an artificial 
stack limit imposed on the initial thread (by sticking the guard page at 
the limit position of the actual stack) of the minimum of the -Xss 
setting and 2M. So if you set -Xss to > 2M it is ignored for the main 
thread even if the true stack is, say, 8M. This limitation dates back 
10-15 years and is no longer relevant today and should be removed (see 
below). I've also added additional explanatory notes.

webrev: http://cr.openjdk.java.net/~dholmes/8170307/webrev/

Testing was manually done by modifying the launcher to not run the VM in 
a new thread, and checking the resulting stack size used.

This change will only affect hosted JVMs launched with a -Xss value > 2M.

Thanks,
David
-----

Bug eval:

JDK-4441425 limits the stack to 8M as a safeguard against an unlimited 
value from getrlimit in 1.3.1, but further constrained that to 2M in 
1.4.0 due to JDK-4466587.

By 1.4.2 we have the basic form of the current problematic code:

#ifndef IA64
   if (rlim.rlim_cur > 2 * K * K) rlim.rlim_cur = 2 * K * K;
#else
   // Problem still exists RH7.2 (IA64 anyway) but 2MB is a little small
   if (rlim.rlim_cur > 4 * K * K) rlim.rlim_cur = 4 * K * K;
#endif

   _initial_thread_stack_size = rlim.rlim_cur & ~(page_size() - 1);

   if (max_size && _initial_thread_stack_size > max_size) {
      _initial_thread_stack_size = max_size;
   }

This was added by JDK-4678676 to allow the stack of the main thread to 
be _reduced_ below the default 2M/4M if the -Xss value was smaller than 
that.** There was no intent to allow the stack size to follow -Xss 
arbitrarily due to the operational constraints imposed by the OS/glibc 
at the time when dealing with the primordial process thread.

** It could not actually change the actual stack size of course, but set 
the guard pages to limit use to the expected stack size.

In JDK 6, under JDK-6316197, the launcher was changed to create the JVM 
in a new thread, so that it was not limited by the idiosyncracies of the 
OS or thread library primordial thread handling. However, the stack size 
limitations remained in place in case the VM was launched from the 
primordial thread of a user application via the JNI invocation API.

I believe it should be safe to remove the 2M limitation now.


More information about the hotspot-dev mailing list