--- old/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp 2020-02-14 18:02:37.139594322 +0100 +++ new/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp 2020-02-14 18:02:36.927591376 +0100 @@ -261,16 +261,12 @@ } G1CMRootMemRegions::G1CMRootMemRegions(uint const max_regions) : - _root_regions(NEW_C_HEAP_ARRAY(MemRegion, max_regions, mtGC)), + _root_regions(MemRegion::create(max_regions, mtGC)), _max_regions(max_regions), _num_root_regions(0), _claimed_root_regions(0), _scan_in_progress(false), - _should_abort(false) { - for (uint i = 0; i < max_regions; i++) { - ::new (&_root_regions[i]) MemRegion(); - } -} + _should_abort(false) { } G1CMRootMemRegions::~G1CMRootMemRegions() { FREE_C_HEAP_ARRAY(MemRegion, _root_regions); --- old/src/hotspot/share/gc/shared/cardTable.cpp 2020-02-14 18:02:37.767603044 +0100 +++ new/src/hotspot/share/gc/shared/cardTable.cpp 2020-02-14 18:02:37.567600266 +0100 @@ -51,19 +51,14 @@ _byte_map(NULL), _byte_map_base(NULL), _cur_covered_regions(0), - _covered(NEW_C_HEAP_ARRAY(MemRegion, _max_covered_regions, mtGC)), - _committed(NEW_C_HEAP_ARRAY(MemRegion, _max_covered_regions, mtGC)), + _covered(MemRegion::create(_max_covered_regions, mtGC)), + _committed(MemRegion::create(_max_covered_regions, mtGC)), _guard_region() { assert((uintptr_t(_whole_heap.start()) & (card_size - 1)) == 0, "heap must start at card boundary"); assert((uintptr_t(_whole_heap.end()) & (card_size - 1)) == 0, "heap must end at card boundary"); assert(card_size <= 512, "card_size must be less than 512"); // why? - - for (int i = 0; i < _max_covered_regions; i++) { - ::new (&_covered[i]) MemRegion(); - ::new (&_committed[i]) MemRegion(); - } } CardTable::~CardTable() { --- old/src/hotspot/share/memory/filemap.cpp 2020-02-14 18:02:38.343611045 +0100 +++ new/src/hotspot/share/memory/filemap.cpp 2020-02-14 18:02:38.127608045 +0100 @@ -1747,10 +1747,7 @@ bool FileMapInfo::map_heap_data(MemRegion **heap_mem, int first, int max, int* num, bool is_open_archive) { - MemRegion* regions = NEW_C_HEAP_ARRAY(MemRegion, max, mtInternal); - for (int i = 0; i < max; i++) { - ::new (®ions[i]) MemRegion(); - } + MemRegion* regions = MemRegion::create(max, mtInternal); FileMapRegion* si; int region_num = 0; --- old/src/hotspot/share/memory/memRegion.cpp 2020-02-14 18:02:38.955619545 +0100 +++ new/src/hotspot/share/memory/memRegion.cpp 2020-02-14 18:02:38.747616657 +0100 @@ -101,3 +101,11 @@ ShouldNotReachHere(); return MemRegion(); } + +MemRegion* MemRegion::create(uint length, MEMFLAGS flags) { + MemRegion* result = NEW_C_HEAP_ARRAY(MemRegion, length, flags); + for (uint i = 0; i < length; i++) { + ::new (&result[i]) MemRegion(); + } + return result; +} --- old/src/hotspot/share/memory/memRegion.hpp 2020-02-14 18:02:39.535627602 +0100 +++ new/src/hotspot/share/memory/memRegion.hpp 2020-02-14 18:02:39.323624659 +0100 @@ -92,6 +92,9 @@ size_t word_size() const { return _word_size; } bool is_empty() const { return word_size() == 0; } + + // Creates and initializes an array of MemRegions of the given length. + static MemRegion* create(uint length, MEMFLAGS flags); }; // For iteration over MemRegion's.