RFR(S) 8161079: Default heap size causes native memory exhaustion on 32 bit Windows

Mikael Gerdin mikael.gerdin at oracle.com
Wed Sep 7 08:46:16 UTC 2016


Hi all,

Please review this small change intended to bound the default heap 
sizing ergonomics on the 32 bit Windows JVM.
The default heap sizing is based on a combination of the MaxRAM and 
MaxRAMFraction flags where the default values end up sizing the heap to 
roughly a quarter of available memory. The problem is that on Windows we 
don't account for the fact that the amount of available address space 
for a 32 bit process is only 2G and in some cases even less due to dlls 
linked into fixed addresses in all processes (hello HydraDMH.dll)

My suggested fix is to attempt to work around this problem by bounding 
the MaxRAM value by ullTotalVirtual as returned by the win32 call 
GlobalMemoryStatusEx().

Performance testing shows a 7-8% throughput reduction but hopefully we 
will see less occurrences of native memory exhaustion as a result.

The reason for this problem not surfacing earlier appears to be a 
combination of:
* -client has been the default on 32 bit Windows and has even further 
bounded heap sizing
* generally more cores in machines in combination with tiered 
compilation and the G1 garbage collector leads to more memory usage by 
thread stacks

Webrev: http://cr.openjdk.java.net/~mgerdin/8161079/webrev.0/
Bug: https://bugs.openjdk.java.net/browse/JDK-8161079

/Mikael


More information about the hotspot-gc-dev mailing list