Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Feb 2007 21:53:25 +0100 (CET)
From:      "Arne H. Juul" <arnej@pvv.ntnu.no>
To:        freebsd-java@freebsd.org
Subject:   patch: autoadjust datasegment size
Message-ID:  <Pine.LNX.4.62.0702222145380.11020@decibel.pvv.ntnu.no>

next in thread | raw e-mail | index | archive | help
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
+  // 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,



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