1.1 --- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Wed Mar 18 11:37:48 2009 -0400 1.2 +++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Mar 19 09:13:24 2009 -0700 1.3 @@ -1422,9 +1422,34 @@ 1.4 // Reserve the maximum. 1.5 PermanentGenerationSpec* pgs = collector_policy()->permanent_generation(); 1.6 // Includes the perm-gen. 1.7 + 1.8 + const size_t total_reserved = max_byte_size + pgs->max_size(); 1.9 + char* addr = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop); 1.10 + 1.11 ReservedSpace heap_rs(max_byte_size + pgs->max_size(), 1.12 HeapRegion::GrainBytes, 1.13 - false /*ism*/); 1.14 + false /*ism*/, addr); 1.15 + 1.16 + if (UseCompressedOops) { 1.17 + if (addr != NULL && !heap_rs.is_reserved()) { 1.18 + // Failed to reserve at specified address - the requested memory 1.19 + // region is taken already, for example, by 'java' launcher. 1.20 + // Try again to reserver heap higher. 1.21 + addr = Universe::preferred_heap_base(total_reserved, Universe::ZeroBasedNarrowOop); 1.22 + ReservedSpace heap_rs0(total_reserved, HeapRegion::GrainBytes, 1.23 + false /*ism*/, addr); 1.24 + if (addr != NULL && !heap_rs0.is_reserved()) { 1.25 + // Failed to reserve at specified address again - give up. 1.26 + addr = Universe::preferred_heap_base(total_reserved, Universe::HeapBasedNarrowOop); 1.27 + assert(addr == NULL, ""); 1.28 + ReservedSpace heap_rs1(total_reserved, HeapRegion::GrainBytes, 1.29 + false /*ism*/, addr); 1.30 + heap_rs = heap_rs1; 1.31 + } else { 1.32 + heap_rs = heap_rs0; 1.33 + } 1.34 + } 1.35 + } 1.36 1.37 if (!heap_rs.is_reserved()) { 1.38 vm_exit_during_initialization("Could not reserve enough space for object heap");