Why can't I allocate 2GB of heap to the JVM on Windows, Part 2 I got an email from Fredrik Paulsson asking about my previous
entry
concerning "Why can't
I
allocate 2GB of heap to the JVM on Windows?" Fredrik (and
others)
have asked about the new /3GB and /PAE switches available in certain
releases of Windows (2000/2003, AS/ES).
There is a description
of the /3GB switch over at the Microsoft website.
Anyways, the use of this switch
does not enable the JVM to
allocate more than 2GB heap on Windows. Why? To the best of my
knowledge,the Java Virtual
Machine wants a contiguous allocation of memory. The
/3GB switch
in Windows does not allow that. The use of non-contiguous memory space
for the 32bit JVM would most probably cause performance issues. Can you
imagine doing garbage collection over 3GB of non-contiguous
RAM? *shudder*
PS> One of the Java VM gods here at Sun confirmed this with the
following:
"
The reason we need a contiguous memory region for the heap is that we
have a bunch of side data structures that are indexed by (scaled)
offsets from the start of the heap. For example, we track object
reference updates with a "card mark array" that has one byte for each
512 bytes of heap. When we store a reference in the heap we have to
mark the corresponding byte in the card mark array. We right shift the
destination address of the store and use that to index the card mark
array. Fun addressing arithmetic games you can't do in Java that you
get to (have to :-) play in C++.
Usually we don't have trouble
getting modest contiguous regions (up
to about 1.5GB on Windohs, up to about 3.8GB on Solaris. YMMV.). On
Windohs, the problem is mostly that there are some libraries that get
loaded before the JVM starts up that break up the address space. Using
the /3GB switch won't rebase those libraries, so they are still a
problem for us.
We know how to make chunked
heaps, but there would be some overhead
to using them. We have more requests for faster storage management than
we do for larger heaps in the 32-bit JVM. If you really want large
heaps, switch to the 64-bit JVM. We still need contiguous memory, but
it's much easier to get in a 64-bit address space.
I hope that
helps
... peter "
7:16:06 PM
|
|