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 }