src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp

changeset 1082
bd441136a5ce
parent 1075
ba50942c8138
parent 1077
660978a2a31a
child 1112
96b229c54d1e
     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");

mercurial