Maximum Java heap size of a 32-bit JVM on a 64-bit OS
32-bit JVMs which expect to have a single large chunk of memory and use raw pointers cannot use more than 4 Gb (since that is the 32 bit limit which also applies to pointers). This includes Sun and - I'm pretty sure - also IBM implementations. I do not know if e.g. JRockit or others have a large memory option with their 32-bit implementations.
If you expect to be hitting this limit you should strongly consider starting a parallel track validating a 64-bit JVM for your production environment so you have that ready for when the 32-bit environment breaks down. Otherwise you will have to do that work under pressure, which is never nice.
Edit 2014-05-15: Oracle FAQ:
The maximum theoretical heap limit for the 32-bit JVM is 4G. Due to various additional constraints such as available swap, kernel address space usage, memory fragmentation, and VM overhead, in practice the limit can be much lower. On most modern 32-bit Windows systems the maximum heap size will range from 1.4G to 1.6G. On 32-bit Solaris kernels the address space is limited to 2G. On 64-bit operating systems running the 32-bit VM, the max heap size can be higher, approaching 4G on many Solaris systems.
Understanding max JVM heap size - 32bit vs 64bit
The 32-bit/64-bit part is unrelated to Java
It turns out that memory locations in a 32-bit system are referenced by 32-bit unsigned integers. This allows up to 2^32 possible memory locations. Since each location stores 1 byte you get 2^32 bytes or 4 GB if you prefer.
On a 64 bit system there are 2^64 locations, or 16 exabytes.
Now, in Windows, the contiguous part becomes a big issue, but that is just how Windows does things. The idea is that you need to have an entire "uninterrupted" range for your heap. Sadly, Windows allocates some memory somewhere in the middle. This basically leaves you with about half the left side or half the right side, about 1.5-2GB chunks, to allocate your heap.
Check out this question for more details on 32 vs 64 bit.
Edit: Thanks mrjoltcola for the exa prefix!
What is the largest possible heap size with a 64-bit JVM?
If you want to use 32-bit references, your heap is limited to 32 GB.
However, if you are willing to use 64-bit references, the size is likely to be limited by your OS, just as it is with 32-bit JVM. e.g. on Windows 32-bit this is 1.2 to 1.5 GB.
Note: you will want your JVM heap to fit into main memory, ideally inside one NUMA region. That's about 1 TB on the bigger machines. If your JVM spans NUMA regions the memory access and the GC in particular will take much longer. If your JVM heap start swapping it might take hours to GC, or even make your machine unusable as it thrashes the swap drive.
Note: You can access large direct memory and memory mapped sizes even if you use 32-bit references in your heap. i.e. use well above 32 GB.
Compressed oops in the Hotspot JVM
Compressed oops represent managed pointers (in many but not all places in the JVM) as 32-bit values which must be scaled by a factor of 8 and added to a 64-bit base address to find the object they refer to. This allows applications to address up to four billion objects (not bytes), or a heap size of up to about 32Gb. At the same time, data structure compactness is competitive with ILP32 mode.
What is the max setting for heap you can set for the 32 bit Sun Java 6 JVM on 64 bit linux?
3788.8 MB is the max heap size for a 32-bit JVM on a 64-bit Linux.
Source: http://pauldone.blogspot.com/2008/08/is-jvms-maximum-heap-size-really-17-gb.html
(For older Java so might actually be more or less for Java 6)
32-bit JVM maximum memory size on 64-bit Windows not as large as expected
Most likely, your address space is fragmented and there isn't more than 550MB available of contiguous address space. If you need to memory map large files, you need to be able to map them in segments if that becomes necessary.
Related Topics
When to Use Generic Methods and When to Use Wild-Card
When to Use Stringbuilder in Java
Converting Java Bitmap to Byte Array
Differencebetween List and Arraylist
Rjava Install Error "Java_Home Cannot Be Determined from the Registry"
How to Start Using and Developing on Ubuntu Linux
Making a Java Package in the Command Line
Wrong Elf Class: Elfclass32 (Possible Cause: Architecture Word Width Mismatch)
What Are the Main Benefits of Using Mono Over Java
How to Cast a List of Supertypes to a List of Subtypes
Find Where Java Class Is Loaded From
Android - Save Image into Gallery
Limit Decimal Places in Android Edittext
Android Studio 3.1.3 Gradle Sync Error. Could Not Download Gradle-Core.Jar
Exception in Thread "Main" Java.Lang.Noclassdeffounderror: Helloworld