# HG changeset patch # User dcubed # Date 1482292372 28800 # Node ID d1b25477073b08dc8a9d0dc05b72069996dea06e # Parent 15a62ca574e93d12cac8399b5b2078f2f7b6164b# Parent 1a8db9cf140701656d35281062e749b9fc008a29 Merge diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/cpu/ppc/vm/globals_ppc.hpp --- a/hotspot/src/cpu/ppc/vm/globals_ppc.hpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/cpu/ppc/vm/globals_ppc.hpp Tue Dec 20 19:52:52 2016 -0800 @@ -42,6 +42,9 @@ #define DEFAULT_STACK_YELLOW_PAGES (2) #define DEFAULT_STACK_RED_PAGES (1) +// Java_java_net_SocketOutputStream_socketWrite0() uses a 64k buffer on the +// stack if compiled for unix and LP64. To pass stack overflow tests we need +// 20 shadow pages. #define DEFAULT_STACK_SHADOW_PAGES (20 DEBUG_ONLY(+2)) #define DEFAULT_STACK_RESERVED_PAGES (1) diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/cpu/x86/vm/globals_x86.hpp --- a/hotspot/src/cpu/x86/vm/globals_x86.hpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/cpu/x86/vm/globals_x86.hpp Tue Dec 20 19:52:52 2016 -0800 @@ -63,9 +63,10 @@ #define MIN_STACK_RED_PAGES DEFAULT_STACK_RED_PAGES #define MIN_STACK_RESERVED_PAGES (0) -#ifdef AMD64 -// Very large C++ stack frames using solaris-amd64 optimized builds -// due to lack of optimization caused by C++ compiler bugs +#ifdef _LP64 +// Java_java_net_SocketOutputStream_socketWrite0() uses a 64k buffer on the +// stack if compiled for unix and LP64. To pass stack overflow tests we need +// 20 shadow pages. #define DEFAULT_STACK_SHADOW_PAGES (NOT_WIN64(20) WIN64_ONLY(7) DEBUG_ONLY(+2)) // For those clients that do not use write socket, we allow // the min range value to be below that of the default @@ -73,7 +74,7 @@ #else #define DEFAULT_STACK_SHADOW_PAGES (4 DEBUG_ONLY(+5)) #define MIN_STACK_SHADOW_PAGES DEFAULT_STACK_SHADOW_PAGES -#endif // AMD64 +#endif // _LP64 define_pd_global(intx, StackYellowPages, DEFAULT_STACK_YELLOW_PAGES); define_pd_global(intx, StackRedPages, DEFAULT_STACK_RED_PAGES); diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os/aix/vm/os_aix.cpp --- a/hotspot/src/os/aix/vm/os_aix.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os/aix/vm/os_aix.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -848,13 +848,13 @@ assert(thread->osthread() == NULL, "caller responsible"); - // Allocate the OSThread object + // Allocate the OSThread object. OSThread* osthread = new OSThread(NULL, NULL); if (osthread == NULL) { return false; } - // set the correct thread state + // Set the correct thread state. osthread->set_thread_type(thr_type); // Initial state is ALLOCATED but not INITIALIZED @@ -862,7 +862,7 @@ thread->set_osthread(osthread); - // init thread attributes + // Init thread attributes. pthread_attr_t attr; pthread_attr_init(&attr); guarantee(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0, "???"); @@ -871,15 +871,18 @@ if (os::Aix::on_aix()) { guarantee(pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0, "???"); guarantee(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0, "???"); - } // end: aix + } // Start in suspended state, and in os::thread_start, wake the thread up. guarantee(pthread_attr_setsuspendstate_np(&attr, PTHREAD_CREATE_SUSPENDED_NP) == 0, "???"); - // calculate stack size if it's not specified by caller + // Calculate stack size if it's not specified by caller. size_t stack_size = os::Posix::get_initial_stack_size(thr_type, req_stack_size); pthread_attr_setstacksize(&attr, stack_size); + // Configure libc guard page. + pthread_attr_setguardsize(&attr, os::Aix::default_guard_size(thr_type)); + pthread_t tid; int ret = pthread_create(&tid, &attr, (void* (*)(void*)) thread_native_entry, thread); @@ -895,7 +898,7 @@ pthread_attr_destroy(&attr); if (ret != 0) { - // Need to clean up stuff we've allocated so far + // Need to clean up stuff we've allocated so far. thread->set_osthread(NULL); delete osthread; return false; @@ -3032,6 +3035,19 @@ return chained; } +size_t os::Aix::default_guard_size(os::ThreadType thr_type) { + // Creating guard page is very expensive. Java thread has HotSpot + // guard pages, only enable glibc guard page for non-Java threads. + // (Remember: compiler thread is a Java thread, too!) + // + // Aix can have different page sizes for stack (4K) and heap (64K). + // As Hotspot knows only one page size, we assume the stack has + // the same page size as the heap. Returning page_size() here can + // cause 16 guard pages which we want to avoid. Thus we return 4K + // which will be rounded to the real page size by the OS. + return ((thr_type == java_thread || thr_type == compiler_thread) ? 0 : 4 * K); +} + struct sigaction* os::Aix::get_preinstalled_handler(int sig) { if (sigismember(&sigs, sig)) { return &sigact[sig]; diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os/aix/vm/os_aix.hpp --- a/hotspot/src/os/aix/vm/os_aix.hpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os/aix/vm/os_aix.hpp Tue Dec 20 19:52:52 2016 -0800 @@ -140,6 +140,9 @@ // libpthread version string static void libpthread_init(); + // Return default libc guard size for the specified thread type. + static size_t default_guard_size(os::ThreadType thr_type); + // Function returns true if we run on OS/400 (pase), false if we run // on AIX. static bool on_pase() { diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os/linux/vm/os_linux.cpp --- a/hotspot/src/os/linux/vm/os_linux.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os/linux/vm/os_linux.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -716,11 +716,18 @@ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - // calculate stack size if it's not specified by caller + // Calculate stack size if it's not specified by caller. size_t stack_size = os::Posix::get_initial_stack_size(thr_type, req_stack_size); + // In the Linux NPTL pthread implementation the guard size mechanism + // is not implemented properly. The posix standard requires adding + // the size of the guard pages to the stack size, instead Linux + // takes the space out of 'stacksize'. Thus we adapt the requested + // stack_size by the size of the guard pages to mimick proper + // behaviour. + stack_size = align_size_up(stack_size + os::Linux::default_guard_size(thr_type), vm_page_size()); pthread_attr_setstacksize(&attr, stack_size); - // glibc guard page + // Configure glibc guard page. pthread_attr_setguardsize(&attr, os::Linux::default_guard_size(thr_type)); ThreadState state; @@ -2849,6 +2856,13 @@ return false; } +size_t os::Linux::default_guard_size(os::ThreadType thr_type) { + // Creating guard page is very expensive. Java thread has HotSpot + // guard pages, only enable glibc guard page for non-Java threads. + // (Remember: compiler thread is a Java thread, too!) + return ((thr_type == java_thread || thr_type == compiler_thread) ? 0 : page_size()); +} + // rebuild_cpu_to_node_map() constructs a table mapping cpud id to node id. // The table is later used in get_node_by_cpu(). void os::Linux::rebuild_cpu_to_node_map() { @@ -6081,6 +6095,101 @@ return yes; } + +// Java/Compiler thread: +// +// Low memory addresses +// P0 +------------------------+ +// | |\ Java thread created by VM does not have glibc +// | glibc guard page | - guard page, attached Java thread usually has +// | |/ 1 glibc guard page. +// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() +// | |\ +// | HotSpot Guard Pages | - red, yellow and reserved pages +// | |/ +// +------------------------+ JavaThread::stack_reserved_zone_base() +// | |\ +// | Normal Stack | - +// | |/ +// P2 +------------------------+ Thread::stack_base() +// +// Non-Java thread: +// +// Low memory addresses +// P0 +------------------------+ +// | |\ +// | glibc guard page | - usually 1 page +// | |/ +// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() +// | |\ +// | Normal Stack | - +// | |/ +// P2 +------------------------+ Thread::stack_base() +// +// ** P1 (aka bottom) and size (P2 = P1 - size) are the address and stack size +// returned from pthread_attr_getstack(). +// ** Due to NPTL implementation error, linux takes the glibc guard page out +// of the stack size given in pthread_attr. We work around this for +// threads created by the VM. (We adapt bottom to be P1 and size accordingly.) +// +#ifndef ZERO +static void current_stack_region(address * bottom, size_t * size) { + if (os::Linux::is_initial_thread()) { + // initial thread needs special handling because pthread_getattr_np() + // may return bogus value. + *bottom = os::Linux::initial_thread_stack_bottom(); + *size = os::Linux::initial_thread_stack_size(); + } else { + pthread_attr_t attr; + + int rslt = pthread_getattr_np(pthread_self(), &attr); + + // JVM needs to know exact stack location, abort if it fails + if (rslt != 0) { + if (rslt == ENOMEM) { + vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); + } else { + fatal("pthread_getattr_np failed with error = %d", rslt); + } + } + + if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { + fatal("Cannot locate current stack attributes!"); + } + + // Work around NPTL stack guard error. + size_t guard_size = 0; + rslt = pthread_attr_getguardsize(&attr, &guard_size); + if (rslt != 0) { + fatal("pthread_attr_getguardsize failed with error = %d", rslt); + } + *bottom += guard_size; + *size -= guard_size; + + pthread_attr_destroy(&attr); + + } + assert(os::current_stack_pointer() >= *bottom && + os::current_stack_pointer() < *bottom + *size, "just checking"); +} + +address os::current_stack_base() { + address bottom; + size_t size; + current_stack_region(&bottom, &size); + return (bottom + size); +} + +size_t os::current_stack_size() { + // This stack size includes the usable stack and HotSpot guard pages + // (for the threads that have Hotspot guard pages). + address bottom; + size_t size; + current_stack_region(&bottom, &size); + return size; +} +#endif + static inline struct timespec get_mtime(const char* filename) { struct stat st; int ret = os::stat(filename, &st); diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os/posix/vm/os_posix.cpp --- a/hotspot/src/os/posix/vm/os_posix.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os/posix/vm/os_posix.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -1096,6 +1096,8 @@ int detachstate = 0; pthread_attr_getstacksize(attr, &stack_size); pthread_attr_getguardsize(attr, &guard_size); + // Work around linux NPTL implementation error, see also os::create_thread() in os_linux.cpp. + LINUX_ONLY(stack_size -= guard_size); pthread_attr_getdetachstate(attr, &detachstate); jio_snprintf(buf, buflen, "stacksize: " SIZE_FORMAT "k, guardsize: " SIZE_FORMAT "k, %s", stack_size / 1024, guard_size / 1024, @@ -1105,14 +1107,18 @@ // Check minimum allowable stack sizes for thread creation and to initialize // the java system classes, including StackOverflowError - depends on page -// size. Add two 4K pages for compiler2 recursion in main thread. -// Add in 4*BytesPerWord 4K pages to account for VM stack during -// class initialization depending on 32 or 64 bit VM. +// size. +// The space needed for frames during startup is platform dependent. It +// depends on word size, platform calling conventions, C frame layout and +// interpreter/C1/C2 design decisions. Therefore this is given in a +// platform (os/cpu) dependent constant. +// To this, space for guard mechanisms is added, which depends on the +// page size which again depends on the concrete system the VM is running +// on. Space for libc guard pages is not included in this size. jint os::Posix::set_minimum_stack_sizes() { - _java_thread_min_stack_allowed = MAX2(_java_thread_min_stack_allowed, - JavaThread::stack_guard_zone_size() + - JavaThread::stack_shadow_zone_size() + - (4 * BytesPerWord COMPILER2_PRESENT(+ 2)) * 4 * K); + _java_thread_min_stack_allowed = _java_thread_min_stack_allowed + + JavaThread::stack_guard_zone_size() + + JavaThread::stack_shadow_zone_size(); _java_thread_min_stack_allowed = align_size_up(_java_thread_min_stack_allowed, vm_page_size()); @@ -1128,28 +1134,14 @@ return JNI_ERR; } -#ifdef SOLARIS - // For 64kbps there will be a 64kb page size, which makes - // the usable default stack size quite a bit less. Increase the - // stack for 64kb (or any > than 8kb) pages, this increases - // virtual memory fragmentation (since we're not creating the - // stack on a power of 2 boundary. The real fix for this - // should be to fix the guard page mechanism. - - if (vm_page_size() > 8*K) { - stack_size_in_bytes = (stack_size_in_bytes != 0) - ? stack_size_in_bytes + - JavaThread::stack_red_zone_size() + - JavaThread::stack_yellow_zone_size() - : 0; - ThreadStackSize = stack_size_in_bytes/K; - } -#endif // SOLARIS - // Make the stack size a multiple of the page size so that // the yellow/red zones can be guarded. - JavaThread::set_stack_size_at_create(round_to(stack_size_in_bytes, - vm_page_size())); + JavaThread::set_stack_size_at_create(round_to(stack_size_in_bytes, vm_page_size())); + + // Reminder: a compiler thread is a Java thread. + _compiler_thread_min_stack_allowed = _compiler_thread_min_stack_allowed + + JavaThread::stack_guard_zone_size() + + JavaThread::stack_shadow_zone_size(); _compiler_thread_min_stack_allowed = align_size_up(_compiler_thread_min_stack_allowed, vm_page_size()); diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os/posix/vm/os_posix.hpp --- a/hotspot/src/os/posix/vm/os_posix.hpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os/posix/vm/os_posix.hpp Tue Dec 20 19:52:52 2016 -0800 @@ -43,7 +43,11 @@ static void print_load_average(outputStream* st); // Minimum stack size a thread can be created with (allowing - // the VM to completely create the thread and enter user code) + // the VM to completely create the thread and enter user code). + // The initial values exclude any guard pages (by HotSpot or libc). + // set_minimum_stack_sizes() will add the size required for + // HotSpot guard pages depending on page size and flag settings. + // Libc guard pages are never considered by these values. static size_t _compiler_thread_min_stack_allowed; static size_t _java_thread_min_stack_allowed; static size_t _vm_internal_thread_min_stack_allowed; diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp --- a/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -535,13 +535,15 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 192 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; +size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; -// return default stack size for thr_type +// Return default stack size for thr_type. size_t os::Posix::default_stack_size(os::ThreadType thr_type) { - // default stack size (compiler thread needs larger stack) + // Default stack size (compiler thread needs larger stack). size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M); return s; } diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp --- a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -839,19 +839,20 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -#ifdef AMD64 -size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 48 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 48 * K; +#ifdef _LP64 size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; #else -size_t os::Posix::_compiler_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; -size_t os::Posix::_java_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; +#endif // _LP64 +#ifndef AMD64 #ifdef __GNUC__ #define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;}) #endif - #endif // AMD64 // return default stack size for thr_type @@ -870,14 +871,14 @@ // // Low memory addresses // +------------------------+ -// | |\ JavaThread created by VM does not have glibc +// | |\ Java thread created by VM does not have glibc // | glibc guard page | - guard, attached Java thread usually has -// | |/ 1 page glibc guard. +// | |/ 1 glibc guard page. // P1 +------------------------+ Thread::stack_base() - Thread::stack_size() // | |\ -// | HotSpot Guard Pages | - red and yellow pages +// | HotSpot Guard Pages | - red, yellow and reserved pages // | |/ -// +------------------------+ JavaThread::stack_yellow_zone_base() +// +------------------------+ JavaThread::stack_reserved_zone_base() // | |\ // | Normal Stack | - // | |/ @@ -925,7 +926,7 @@ int rslt = pthread_stackseg_np(pthread_self(), &ss); if (rslt != 0) - fatal("pthread_stackseg_np failed with err = %d", rslt); + fatal("pthread_stackseg_np failed with error = %d", rslt); *bottom = (address)((char *)ss.ss_sp - ss.ss_size); *size = ss.ss_size; @@ -936,12 +937,12 @@ // JVM needs to know exact stack location, abort if it fails if (rslt != 0) - fatal("pthread_attr_init failed with err = %d", rslt); + fatal("pthread_attr_init failed with error = %d", rslt); rslt = pthread_attr_get_np(pthread_self(), &attr); if (rslt != 0) - fatal("pthread_attr_get_np failed with err = %d", rslt); + fatal("pthread_attr_get_np failed with error = %d", rslt); if (pthread_attr_getstackaddr(&attr, (void **)bottom) != 0 || pthread_attr_getstacksize(&attr, size) != 0) { diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp --- a/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -310,7 +310,7 @@ int rslt = pthread_stackseg_np(pthread_self(), &ss); if (rslt != 0) - fatal("pthread_stackseg_np failed with err = " INT32_FORMAT, rslt); + fatal("pthread_stackseg_np failed with error = " INT32_FORMAT, rslt); stack_top = (address) ss.ss_sp; stack_bytes = ss.ss_size; @@ -322,12 +322,12 @@ // JVM needs to know exact stack location, abort if it fails if (rslt != 0) - fatal("pthread_attr_init failed with err = " INT32_FORMAT, rslt); + fatal("pthread_attr_init failed with error = " INT32_FORMAT, rslt); rslt = pthread_attr_get_np(pthread_self(), &attr); if (rslt != 0) - fatal("pthread_attr_get_np failed with err = " INT32_FORMAT, rslt); + fatal("pthread_attr_get_np failed with error = " INT32_FORMAT, rslt); if (pthread_attr_getstackaddr(&attr, (void **) &stack_bottom) != 0 || pthread_attr_getstacksize(&attr, &stack_bytes) != 0) { diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp --- a/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -473,8 +473,10 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 32 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 32 * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; // return default stack size for thr_type @@ -484,91 +486,6 @@ return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // Creating guard page is very expensive. Java thread has HotSpot - // guard page, only enable glibc guard page for non-Java threads. - return (thr_type == java_thread ? 0 : page_size()); -} - -// Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ JavaThread created by VM does not have glibc -// | glibc guard page | - guard, attached Java thread usually has -// | |/ 1 page glibc guard. -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | HotSpot Guard Pages | - red and yellow pages -// | |/ -// +------------------------+ JavaThread::stack_yellow_zone_base() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// Non-Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ -// | glibc guard page | - usually 1 page -// | |/ -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from -// pthread_attr_getstack() - -static void current_stack_region(address * bottom, size_t * size) { - if (os::Linux::is_initial_thread()) { - // initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed with errno = %d", rslt); - } - } - - if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); -} - -address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return (bottom + size); -} - -size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; -} - ///////////////////////////////////////////////////////////////////////////// // helper functions for fatal error handler diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os_cpu/linux_arm/vm/os_linux_arm.cpp --- a/hotspot/src/os_cpu/linux_arm/vm/os_linux_arm.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os_cpu/linux_arm/vm/os_linux_arm.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -526,8 +526,10 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; -size_t os::Posix::_java_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = (32 DEBUG_ONLY(+ 4)) * K; +size_t os::Posix::_java_thread_min_stack_allowed = (32 DEBUG_ONLY(+ 4)) * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; // return default stack size for thr_type @@ -537,91 +539,6 @@ return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // Creating guard page is very expensive. Java thread has HotSpot - // guard page, only enable glibc guard page for non-Java threads. - return (thr_type == java_thread ? 0 : page_size()); -} - -// Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ JavaThread created by VM does not have glibc -// | glibc guard page | - guard, attached Java thread usually has -// | |/ 1 page glibc guard. -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | HotSpot Guard Pages | - red and yellow pages -// | |/ -// +------------------------+ JavaThread::stack_yellow_zone_base() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// Non-Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ -// | glibc guard page | - usually 1 page -// | |/ -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from -// pthread_attr_getstack() - -static void current_stack_region(address * bottom, size_t * size) { - if (os::Linux::is_initial_thread()) { - // initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed"); - } - } - - if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); -} - -address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return (bottom + size); -} - -size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; -} - ///////////////////////////////////////////////////////////////////////////// // helper functions for fatal error handler diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp --- a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -535,100 +535,19 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; +size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; -// return default stack size for thr_type +// Return default stack size for thr_type. size_t os::Posix::default_stack_size(os::ThreadType thr_type) { - // default stack size (compiler thread needs larger stack) + // Default stack size (compiler thread needs larger stack). size_t s = (thr_type == os::compiler_thread ? 4 * M : 1024 * K); return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - return 2 * page_size(); -} - -// Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ JavaThread created by VM does not have glibc -// | glibc guard page | - guard, attached Java thread usually has -// | |/ 1 page glibc guard. -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | HotSpot Guard Pages | - red and yellow pages -// | |/ -// +------------------------+ JavaThread::stack_yellow_zone_base() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// Non-Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ -// | glibc guard page | - usually 1 page -// | |/ -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from -// pthread_attr_getstack() - -static void current_stack_region(address * bottom, size_t * size) { - if (os::Linux::is_initial_thread()) { - // initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed with errno = %d", rslt); - } - } - - if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); -} - -address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return (bottom + size); -} - -size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; -} - ///////////////////////////////////////////////////////////////////////////// // helper functions for fatal error handler diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp --- a/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -473,103 +473,19 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = (52 DEBUG_ONLY(+ 32)) * K; +size_t os::Posix::_java_thread_min_stack_allowed = (32 DEBUG_ONLY(+ 8)) * K; +size_t os::Posix::_vm_internal_thread_min_stack_allowed = 32 * K; -// return default stack size for thr_type +// Return default stack size for thr_type. size_t os::Posix::default_stack_size(os::ThreadType thr_type) { - // default stack size (compiler thread needs larger stack) + // Default stack size (compiler thread needs larger stack). size_t s = (thr_type == os::compiler_thread ? 4 * M : 1024 * K); return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // z/Architecture: put 2 guard pages right in the middle of thread stack. This value - // should be consistent with the value used by register stack handling code. - return 2 * page_size(); -} - -// Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ -// | glibc guard page | - Right in the middle of stack, 2 pages -// | |/ -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | HotSpot Guard Pages | - red and yellow pages -// | |/ -// +------------------------+ JavaThread::stack_yellow_zone_base() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// Non-Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ -// | glibc guard page | - Right in the middle of stack, 2 pages -// | |/ -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// ** P2 is the address returned from pthread_attr_getstackaddr(), P2 - P1 -// is the stack size returned by pthread_attr_getstacksize(). - - -static void current_stack_region(address * bottom, size_t * size) { - if (os::Linux::is_initial_thread()) { - // Initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed with errno = %d", rslt); - } - } - - if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); -} - -address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return (bottom + size); -} - -size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; -} - ///////////////////////////////////////////////////////////////////////////// // helper functions for fatal error handler diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp --- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -156,51 +156,6 @@ return (address)sp; } -static void current_stack_region(address* bottom, size_t* size) { - if (os::Linux::is_initial_thread()) { - // initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed with errno = %d", rslt); - } - } - - if (pthread_attr_getstack(&attr, (void**)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); -} - -address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return bottom + size; -} - -size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; -} - char* os::non_memory_address_word() { // Must never look like an address returned by reserve_memory, // even in its subfields (as defined by the CPU immediate fields, @@ -726,8 +681,10 @@ /////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 128 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K; // return default stack size for thr_type @@ -737,12 +694,6 @@ return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // Creating guard page is very expensive. Java thread has HotSpot - // guard page, only enable glibc guard page for non-Java threads. - return (thr_type == java_thread ? 0 : page_size()); -} - #ifndef PRODUCT void os::verify_stack_alignment() { } diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp --- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -677,15 +677,15 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -#ifdef AMD64 -size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 48 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 40 * K; +#ifdef _LP64 size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; #else -size_t os::Posix::_compiler_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; -size_t os::Posix::_java_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; -#endif // AMD64 +#endif // _LP64 // return default stack size for thr_type size_t os::Posix::default_stack_size(os::ThreadType thr_type) { @@ -698,91 +698,6 @@ return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // Creating guard page is very expensive. Java thread has HotSpot - // guard page, only enable glibc guard page for non-Java threads. - return (thr_type == java_thread ? 0 : page_size()); -} - -// Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ JavaThread created by VM does not have glibc -// | glibc guard page | - guard, attached Java thread usually has -// | |/ 1 page glibc guard. -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | HotSpot Guard Pages | - red and yellow pages -// | |/ -// +------------------------+ JavaThread::stack_yellow_zone_base() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// Non-Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ -// | glibc guard page | - usually 1 page -// | |/ -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from -// pthread_attr_getstack() - -static void current_stack_region(address * bottom, size_t * size) { - if (os::Linux::is_initial_thread()) { - // initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed with errno = %d", rslt); - } - } - - if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); -} - -address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return (bottom + size); -} - -size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; -} - ///////////////////////////////////////////////////////////////////////////// // helper functions for fatal error handler diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp --- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -320,12 +320,6 @@ return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // Only enable glibc guard pages for non-Java threads - // (Java threads have HotSpot guard pages) - return (thr_type == java_thread ? 0 : page_size()); -} - static void current_stack_region(address *bottom, size_t *size) { pthread_attr_t attr; int res = pthread_getattr_np(pthread_self(), &attr); @@ -334,7 +328,7 @@ vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); } else { - fatal("pthread_getattr_np failed with errno = %d", res); + fatal("pthread_getattr_np failed with error = %d", res); } } @@ -342,7 +336,7 @@ size_t stack_bytes; res = pthread_attr_getstack(&attr, (void **) &stack_bottom, &stack_bytes); if (res != 0) { - fatal("pthread_attr_getstack failed with errno = %d", res); + fatal("pthread_attr_getstack failed with error = %d", res); } address stack_top = stack_bottom + stack_bytes; diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp --- a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -81,15 +81,13 @@ #define MAX_PATH (2 * K) -// Minimum stack size for the VM. It's easier to document a constant -// but it's different for x86 and sparc because the page sizes are different. +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 104 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 86 * K; #ifdef _LP64 -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 128 * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K; #else -size_t os::Posix::_compiler_thread_min_stack_allowed = 96 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 96 * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = 96 * K; #endif diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp --- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Tue Dec 20 19:52:52 2016 -0800 @@ -86,19 +86,23 @@ #define MAX_PATH (2 * K) -// Minimum stack sizes for the VM. It's easier to document a constant value -// but it's different for x86 and sparc because the page sizes are different. +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +#ifdef _LP64 +size_t os::Posix::_compiler_thread_min_stack_allowed = 202 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 48 * K; +size_t os::Posix::_vm_internal_thread_min_stack_allowed = 224 * K; +#else +size_t os::Posix::_compiler_thread_min_stack_allowed = 32 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 32 * K; +size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; +#endif // _LP64 + #ifdef AMD64 -size_t os::Posix::_compiler_thread_min_stack_allowed = 394 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 224 * K; -size_t os::Posix::_vm_internal_thread_min_stack_allowed = 224 * K; #define REG_SP REG_RSP #define REG_PC REG_RIP #define REG_FP REG_RBP #else -size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; -size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; #define REG_SP UESP #define REG_PC EIP #define REG_FP EBP diff -r 15a62ca574e9 -r d1b25477073b hotspot/src/share/vm/runtime/os.hpp --- a/hotspot/src/share/vm/runtime/os.hpp Tue Dec 20 20:42:15 2016 -0500 +++ b/hotspot/src/share/vm/runtime/os.hpp Tue Dec 20 19:52:52 2016 -0800 @@ -436,7 +436,7 @@ vm_thread, cgc_thread, // Concurrent GC thread pgc_thread, // Parallel GC thread - java_thread, + java_thread, // Java, CodeCacheSweeper, JVMTIAgent and Service threads. compiler_thread, watcher_thread, os_thread