diff -ru jdk-1_5_0_11.b4/hotspot/src/os/bsd/vm/os_bsd.cpp jdk-1_5_0_11.ahj12/hotspot/src/os/bsd/vm/os_bsd.cpp --- jdk-1_5_0_11.b4/hotspot/src/os/bsd/vm/os_bsd.cpp Sun Feb 18 16:13:42 2007 +++ jdk-1_5_0_11.ahj12/hotspot/src/os/bsd/vm/os_bsd.cpp Tue Feb 20 22:29:27 2007 @@ -2706,7 +2833,30 @@ // this is called _after_ the global arguments have been parsed jint os::init_2(void) { - + + // XXX ugly hack for 32-bit address space, since we know the + // java heap is allocated with mmap() not sbrk(): +#if SSIZE_MAX == 0x7fffffff + // set the max datasegment size to something reasonable + // complain if getrlimit/setrlimit fails but continue regardless. + struct rlimit dseg_size; + int status = getrlimit(RLIMIT_DATA, &dseg_size); + if (status != 0) { + if (PrintMiscellaneous && (Verbose || WizardMode)) + perror("os::init_2 getrlimit failed"); + } else { + if (dseg_size.rlim_max > 1000 * 1024 * 1024) { + dseg_size.rlim_max = 500 * 1024 * 1024; + dseg_size.rlim_cur = 500 * 1024 * 1024; + status = setrlimit(RLIMIT_DATA, &dseg_size); + if (status != 0) { + if (PrintMiscellaneous && (Verbose || WizardMode)) + perror("os::init_2 setrlimit failed"); + } + } + } +#endif + // Allocate a single page and mark it as readable for safepoint polling if( SafepointPolling ) { address polling_page = (address) ::mmap(NULL, page_size,