Heap size limit in java
paul at aps.org
Fri Jun 18 16:06:06 GMT 2004
I originally posed to my question to freebsd-java. My issue was that I
was unable to set a java heap size of more than approx 2000m using java
(-Xmx2000m), it would fail with the error "COuld not reserve enough
space for object heap.
Panagiotis Astithas looked into this a bit further and found that it
was due to the JVM being unable to mmap 3gb or more of memory. His
explanation is below along with some of the background information.
Any help would be greatly appreciated. I imagine others have hit this
issue or will shortly. It's somewhat critical to getting large scale
java applications running on FreeBSD that the JVM be able to access
From: Panagiotis Astithas <past at noc.ntua.gr>
Date: May 24, 2004 3:57:27 AM EDT
To: Greg Lewis <glewis at eyesbeyond.com>
Cc: Paul Dlug <paul at aps.org>, freebsd-java at freebsd.org
Subject: Re: Heap size limit
Greg Lewis wrote:
> On Fri, Apr 23, 2004 at 09:49:27AM -0400, Paul Dlug wrote:
>> I'm trying to start a JVM with a large heap size and getting an error
>> java -Xms256m -Xmx2024m
>> Error occurred during initialization of VM
>> Could not reserve enough space for object heap
>> I tried a bunch of different sizes and anything under 2024m works
>> just fine so this appears to be a hard limit. I've tried changing a
>> few system parameters but can't seem to stumble on the right one. Can
>> someone help me out with this?
> Obviously I'm a long way behind on freebsd-java, but I'm catching up
> My strong suggestion is that you're hitting the maximum amount of
> that your user can mmap. I'm not exactly sure what setting dictate
> but its almost certainly what you're running into.
ktrace java -Xms256m -Xmx2024m
15034 java CALL mmap(0,0x82800000,0,0x1042,0xffffffff,0,0,0)
15034 java RET mmap -1 errno 22 Invalid argument
15034 java CALL write(0x1,0xbfbfd670,0x2b)
15034 java GIO fd 1 wrote 43 bytes
"Error occurred during initialization of VM
15034 java RET write 43/0x2b
15034 java CALL write(0x1,0xbfbfd670,0x2e)
15034 java GIO fd 1 wrote 46 bytes
"Could not reserve enough space for object heap"
% grep 22 /usr/include/errno.h
#define EINVAL 22 /* Invalid argument */
[EINVAL] MAP_FIXED was specified and the addr argument was not
page aligned, or part of the desired address space
resides out of the valid address space for a user
Now try changing vm.max_proc_mmap to an insanely large value:
# sysctl vm.max_proc_mmap=10000000000000
vm.max_proc_mmap: 26960 -> 2147483647
We see the requested size gets truncated to 2 GB.
This still doesn't help us, though:
# /usr/local/jdk1.4.2/bin/java -Xms256m -Xmx2024m
Error occurred during initialization of VM
Could not reserve enough space for object heap
The weird thing is that in a GENERIC kernel, the kernel/userland
address space split is 1 GB / 3 GB. As it can bee sen from the
following excerpt from /sys/i386/conf/NOTES:
# Change the size of the kernel virtual address space. Due to
# constraints in loader(8) on i386, this must be a multiple of 4.
# 256 = 1 GB of kernel address space. Increasing this also causes
# a reduction of the address space in user processes. 512 splits
# the 4GB cpu address space in half (2GB user, 2GB kernel).
Why you can't mmap up to 3 GB of memory, I don't know. Perhaps we
should take it to -current or -hackers.
Electrical & Computer Engineer, PhD
Network Management Center
National Technical University of Athens, Greece
More information about the freebsd-current