The amount of memory available to the Java Heap and Native Heap for a Java process is limited by the Operating System and hardware. A 32 bit Java process has a 4 GB process address space available shared by the Java Heap, Native Heap and the Operating System. 32 bit Java processes have a maximum possible heap size which varies according to the operating system and platform used.
64 bit processes do not have this limit and the addressability is in terabytes. It is common for many enterprise applications to have large java heaps (we have seen applications with java heap requirements of over 100 GB). 64 bit Java allows massive Java heaps (benchmark released with heaps upto 200 GB)
However the ability to use more memory is not “free”. 64 bit applications also require more memory as java Object references and internal pointers are larger. The same Java application running on a 64 bit Java Runtime may have 70% more footprint as compared to running on a 32 bit Runtime. 64 bit applications also perform slower as more data is manipulated and cache performance is reduced. (As data is larger, processor cache is less effective). 64 bit applications can be upto 20% slower.
IBM® WebSphere® Application Server (WAS) version 7.0 (shipped with JDK 6.0) introduced the Compressed Reference (CR) technology which significantly improves the performance on 64-bit WAS deployments.
Compressed references allows a 64 bit JVM to use a pointer smaller than 64-bit wide to reference memory. It uses a pointer compression technology and optimizes memory references to be just 32-bits wide (i.e compresses all memory references from 64-bit to 32-bit). Using the Compressed References Technology, WAS instances can allocated heap sizes up to 25 GB without incurring any significant performance cost.
Compressed References can be enabled by using the option –Xcompressedrefs.
In WebSphere V7 and above for the 64 bit deployments, if WAS detects that the Xmx (maximum Java heap) requested is less than 25 GB, it enables the pointer compression by default (this can be disabled through the –Xnocompressedrefs option with the Java command line)