[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freebsd-java
Subject:    Re: patch: autoadjust datasegment size
From:       Kurt Miller <lists () intricatesoftware ! com>
Date:       2007-03-07 19:54:02
Message-ID: 200703071454.02785.lists () intricatesoftware ! com
[Download RAW message or body]

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"
> 
_______________________________________________
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"


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic