--- /dev/null 2019-01-23 10:08:26.972556532 +0100 +++ new/src/hotspot/share/gc/g1/g1CollectionSetCandidates.hpp 2019-01-23 10:44:03.012913501 +0100 @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_GC_G1_G1COLLECTIONSETCANDIDATES_HPP +#define SHARE_GC_G1_G1COLLECTIONSETCANDIDATES_HPP + +#include "gc/g1/g1CollectionSetCandidates.hpp" +#include "gc/shared/workgroup.hpp" +#include "memory/allocation.hpp" +#include "runtime/globals.hpp" + +class HeapRegion; +class HeapRegionClosure; + +// Set of collection set candidates, i.e. all old gen regions we consider worth +// collecting in the remainder of the current mixed phase. Regions are sorted by decreasing +// gc efficiency. +// Maintains a cursor into the list that specifies the next collection set candidate +// to put into the current collection set. +class G1CollectionSetCandidates : public CHeapObj { + HeapRegion** _regions; + uint _num_regions; // Total number of regions in the collection set candidate set. + + // The sum of bytes that can be reclaimed in the remaining set of collection + // set candidates. + size_t _remaining_reclaimable_bytes; + // The index of the next candidate old region to be considered for + // addition to the current collection set. + uint _front_idx; + +public: + G1CollectionSetCandidates(HeapRegion** regions, uint num_regions, size_t remaining_reclaimable_bytes) : + _regions(regions), + _num_regions(num_regions), + _remaining_reclaimable_bytes(remaining_reclaimable_bytes), + _front_idx(0) { } + + ~G1CollectionSetCandidates() { + FREE_C_HEAP_ARRAY(HeapRegion*, _regions); + } + + // Returns the total number of collection set candidate old regions added. + uint num_regions() { return _num_regions; } + + // Return the candidate region at the cursor position to be considered for collection without + // removing it. + HeapRegion* peek_front() { + HeapRegion* res = NULL; + if (_front_idx < _num_regions) { + res = _regions[_front_idx]; + assert(res != NULL, "Unexpected NULL HeapRegion at index %u", _front_idx); + } + return res; + } + + // Remove the given region from the candidates set and move the cursor to the next one. + HeapRegion* pop_front(); + + // Add the given HeapRegion to the front of the collection set candidate set again. + void push_front(HeapRegion* hr); + + // Iterate over all remaining collection set candidate regions. + void iterate(HeapRegionClosure* cl); + + // Return the number of candidate regions remaining. + uint num_remaining() { return _num_regions - _front_idx; } + + bool is_empty() { return num_remaining() == 0; } + + // Return the amount of reclaimable bytes that may be collected by the remaining + // candidate regions. + size_t remaining_reclaimable_bytes() { return _remaining_reclaimable_bytes; } + + void verify() const PRODUCT_RETURN; +}; + +#endif /* SHARE_GC_G1_G1COLLECTIONSETCANDIDATES_HPP */ +