Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 7 Mar 2007 14:54:02 -0500
From:      Kurt Miller <lists@intricatesoftware.com>
To:        freebsd-java@freebsd.org
Cc:        "Arne H. Juul" <arnej@pvv.ntnu.no>
Subject:   Re: patch: autoadjust datasegment size
Message-ID:  <200703071454.02785.lists@intricatesoftware.com>
In-Reply-To: <Pine.LNX.4.62.0702222145380.11020@decibel.pvv.ntnu.no>
References:  <Pine.LNX.4.62.0702222145380.11020@decibel.pvv.ntnu.no>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi Arne,

Some comments inline...

On Thursday 22 February 2007 3:53:25 pm Arne H. Juul wrote:
> We're running in an environment where the default datasegment size is 
> often adjusted upwards to provide more address space for applications that 
> allocate a lot of memory, but this causes the Java VM to fail during 
> startup since the Java heap is allocated outside the data segment by using 
> mmap().  I've been compiling with a patch (below) that auto-adjusts the 
> datasegment down to a "reasonable" value.
> 
> I don't know enough about the details of the VM system of the various BSDs 
> to be certain that this is generally applicable, but my guess is that this 
> will be useful on all 32-bit BSDs.
> 
>   -  Arne H. J.
> 
> 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

On OpenBSD mmap is constrained by RLIMIT_DATA too. Not sure
about NetBSD though. I think the _LP64 define is the more
common way to check for 64bit vs 32bit:

#if !defined(__OpenBSD__) && !defined(_LP64)

> +  // 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;

Some spot checking on 6.1 revealed that data seg size
could be increased to slightly above 800M before
interfeering with the jvm. I think it would be better
if this was constrained by 800M instead of 1G and
if > 800M then set to 800M.

> +        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,
> _______________________________________________
> freebsd-java@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-java
> To unsubscribe, send any mail to "freebsd-java-unsubscribe@freebsd.org"
> 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200703071454.02785.lists>