When we run with compressed oops we pick an address where we want to map the Java heap. This address gets passed down the chain and on Windows we eventually we end up in os::reserve_memory_special() if we have large pages enabled.
The os::reserve_memory_special() method has two branches. One for UseLargePagesIndividualAllocation, which seems to work properly, and one for only UseLargePages. The latter one does this os call:
VirtualAlloc(NULL, bytes, flag, prot);
The first parameter to VirtualAlloc is the address where you want the memory mapped. We get this passed in as the parameter addr, but this call anyway passes NULL to VirtualAlloc.
This means that we will not get memory mapped where we want it and ReservedSpace::initialize() will call failed_to_reserve_as_requested() which will throw away the large page mapping and retry with small pages.
Impact=M (no crash, but likely loss of performance)
Likelihood=M (Windows only. Large pages and compressed oops only.)
Workaround=M (Use UseLargePagesIndividualAllocation to get some large pages at least)
ILW=MMM -> P3