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

changeset 7781
33e421924c67
parent 7509
ae52ee069062
     1.1 --- a/src/share/vm/gc_implementation/g1/g1RegionToSpaceMapper.cpp	Fri Jan 16 10:29:12 2015 +0100
     1.2 +++ b/src/share/vm/gc_implementation/g1/g1RegionToSpaceMapper.cpp	Tue Apr 07 10:53:51 2015 +0200
     1.3 @@ -1,5 +1,5 @@
     1.4  /*
     1.5 - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
     1.6 + * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved.
     1.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8   *
     1.9   * This code is free software; you can redistribute it and/or modify it
    1.10 @@ -31,17 +31,16 @@
    1.11  #include "utilities/bitMap.inline.hpp"
    1.12  
    1.13  G1RegionToSpaceMapper::G1RegionToSpaceMapper(ReservedSpace rs,
    1.14 -                                             size_t commit_granularity,
    1.15 +                                             size_t used_size,
    1.16 +                                             size_t page_size,
    1.17                                               size_t region_granularity,
    1.18                                               MemoryType type) :
    1.19 -  _storage(),
    1.20 -  _commit_granularity(commit_granularity),
    1.21 +  _storage(rs, used_size, page_size),
    1.22    _region_granularity(region_granularity),
    1.23    _listener(NULL),
    1.24    _commit_map() {
    1.25 -  guarantee(is_power_of_2(commit_granularity), "must be");
    1.26 +  guarantee(is_power_of_2(page_size), "must be");
    1.27    guarantee(is_power_of_2(region_granularity), "must be");
    1.28 -  _storage.initialize_with_granularity(rs, commit_granularity);
    1.29  
    1.30    MemTracker::record_virtual_memory_type((address)rs.base(), type);
    1.31  }
    1.32 @@ -55,25 +54,26 @@
    1.33  
    1.34   public:
    1.35    G1RegionsLargerThanCommitSizeMapper(ReservedSpace rs,
    1.36 -                                      size_t os_commit_granularity,
    1.37 +                                      size_t actual_size,
    1.38 +                                      size_t page_size,
    1.39                                        size_t alloc_granularity,
    1.40                                        size_t commit_factor,
    1.41                                        MemoryType type) :
    1.42 -     G1RegionToSpaceMapper(rs, os_commit_granularity, alloc_granularity, type),
    1.43 -    _pages_per_region(alloc_granularity / (os_commit_granularity * commit_factor)) {
    1.44 +    G1RegionToSpaceMapper(rs, actual_size, page_size, alloc_granularity, type),
    1.45 +    _pages_per_region(alloc_granularity / (page_size * commit_factor)) {
    1.46  
    1.47 -    guarantee(alloc_granularity >= os_commit_granularity, "allocation granularity smaller than commit granularity");
    1.48 +    guarantee(alloc_granularity >= page_size, "allocation granularity smaller than commit granularity");
    1.49      _commit_map.resize(rs.size() * commit_factor / alloc_granularity, /* in_resource_area */ false);
    1.50    }
    1.51  
    1.52 -  virtual void commit_regions(uintptr_t start_idx, size_t num_regions) {
    1.53 -    bool zero_filled = _storage.commit(start_idx * _pages_per_region, num_regions * _pages_per_region);
    1.54 +  virtual void commit_regions(uint start_idx, size_t num_regions) {
    1.55 +    bool zero_filled = _storage.commit((size_t)start_idx * _pages_per_region, num_regions * _pages_per_region);
    1.56      _commit_map.set_range(start_idx, start_idx + num_regions);
    1.57      fire_on_commit(start_idx, num_regions, zero_filled);
    1.58    }
    1.59  
    1.60 -  virtual void uncommit_regions(uintptr_t start_idx, size_t num_regions) {
    1.61 -    _storage.uncommit(start_idx * _pages_per_region, num_regions * _pages_per_region);
    1.62 +  virtual void uncommit_regions(uint start_idx, size_t num_regions) {
    1.63 +    _storage.uncommit((size_t)start_idx * _pages_per_region, num_regions * _pages_per_region);
    1.64      _commit_map.clear_range(start_idx, start_idx + num_regions);
    1.65    }
    1.66  };
    1.67 @@ -98,22 +98,23 @@
    1.68  
    1.69   public:
    1.70    G1RegionsSmallerThanCommitSizeMapper(ReservedSpace rs,
    1.71 -                                       size_t os_commit_granularity,
    1.72 +                                       size_t actual_size,
    1.73 +                                       size_t page_size,
    1.74                                         size_t alloc_granularity,
    1.75                                         size_t commit_factor,
    1.76                                         MemoryType type) :
    1.77 -     G1RegionToSpaceMapper(rs, os_commit_granularity, alloc_granularity, type),
    1.78 -    _regions_per_page((os_commit_granularity * commit_factor) / alloc_granularity), _refcounts() {
    1.79 +    G1RegionToSpaceMapper(rs, actual_size, page_size, alloc_granularity, type),
    1.80 +    _regions_per_page((page_size * commit_factor) / alloc_granularity), _refcounts() {
    1.81  
    1.82 -    guarantee((os_commit_granularity * commit_factor) >= alloc_granularity, "allocation granularity smaller than commit granularity");
    1.83 -    _refcounts.initialize((HeapWord*)rs.base(), (HeapWord*)(rs.base() + rs.size()), os_commit_granularity);
    1.84 +    guarantee((page_size * commit_factor) >= alloc_granularity, "allocation granularity smaller than commit granularity");
    1.85 +    _refcounts.initialize((HeapWord*)rs.base(), (HeapWord*)(rs.base() + align_size_up(rs.size(), page_size)), page_size);
    1.86      _commit_map.resize(rs.size() * commit_factor / alloc_granularity, /* in_resource_area */ false);
    1.87    }
    1.88  
    1.89 -  virtual void commit_regions(uintptr_t start_idx, size_t num_regions) {
    1.90 -    for (uintptr_t i = start_idx; i < start_idx + num_regions; i++) {
    1.91 -      assert(!_commit_map.at(i), err_msg("Trying to commit storage at region "INTPTR_FORMAT" that is already committed", i));
    1.92 -      uintptr_t idx = region_idx_to_page_idx(i);
    1.93 +  virtual void commit_regions(uint start_idx, size_t num_regions) {
    1.94 +    for (uint i = start_idx; i < start_idx + num_regions; i++) {
    1.95 +      assert(!_commit_map.at(i), err_msg("Trying to commit storage at region %u that is already committed", i));
    1.96 +      size_t idx = region_idx_to_page_idx(i);
    1.97        uint old_refcount = _refcounts.get_by_index(idx);
    1.98        bool zero_filled = false;
    1.99        if (old_refcount == 0) {
   1.100 @@ -125,10 +126,10 @@
   1.101      }
   1.102    }
   1.103  
   1.104 -  virtual void uncommit_regions(uintptr_t start_idx, size_t num_regions) {
   1.105 -    for (uintptr_t i = start_idx; i < start_idx + num_regions; i++) {
   1.106 -      assert(_commit_map.at(i), err_msg("Trying to uncommit storage at region "INTPTR_FORMAT" that is not committed", i));
   1.107 -      uintptr_t idx = region_idx_to_page_idx(i);
   1.108 +  virtual void uncommit_regions(uint start_idx, size_t num_regions) {
   1.109 +    for (uint i = start_idx; i < start_idx + num_regions; i++) {
   1.110 +      assert(_commit_map.at(i), err_msg("Trying to uncommit storage at region %u that is not committed", i));
   1.111 +      size_t idx = region_idx_to_page_idx(i);
   1.112        uint old_refcount = _refcounts.get_by_index(idx);
   1.113        assert(old_refcount > 0, "must be");
   1.114        if (old_refcount == 1) {
   1.115 @@ -147,14 +148,15 @@
   1.116  }
   1.117  
   1.118  G1RegionToSpaceMapper* G1RegionToSpaceMapper::create_mapper(ReservedSpace rs,
   1.119 -                                                            size_t os_commit_granularity,
   1.120 +                                                            size_t actual_size,
   1.121 +                                                            size_t page_size,
   1.122                                                              size_t region_granularity,
   1.123                                                              size_t commit_factor,
   1.124                                                              MemoryType type) {
   1.125  
   1.126 -  if (region_granularity >= (os_commit_granularity * commit_factor)) {
   1.127 -    return new G1RegionsLargerThanCommitSizeMapper(rs, os_commit_granularity, region_granularity, commit_factor, type);
   1.128 +  if (region_granularity >= (page_size * commit_factor)) {
   1.129 +    return new G1RegionsLargerThanCommitSizeMapper(rs, actual_size, page_size, region_granularity, commit_factor, type);
   1.130    } else {
   1.131 -    return new G1RegionsSmallerThanCommitSizeMapper(rs, os_commit_granularity, region_granularity, commit_factor, type);
   1.132 +    return new G1RegionsSmallerThanCommitSizeMapper(rs, actual_size, page_size, region_granularity, commit_factor, type);
   1.133    }
   1.134  }

mercurial