blob: 75dd3f998d63e3cfa780bccd61128391fa6cd31d [file] [edit]
/*
* Copyright (c) 1997, 2025, 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_SHARED_SPACE_HPP
#define SHARE_GC_SHARED_SPACE_HPP
#include "gc/shared/blockOffsetTable.hpp"
#include "gc/shared/cardTable.hpp"
#include "gc/shared/workerThread.hpp"
#include "memory/allocation.hpp"
#include "memory/iterator.hpp"
#include "memory/memRegion.hpp"
#include "oops/markWord.hpp"
#include "runtime/mutexLocker.hpp"
#include "utilities/align.hpp"
#include "utilities/macros.hpp"
// A space is an abstraction for the "storage units" backing
// up the generation abstraction. It includes specific
// implementations for keeping track of free and used space,
// for iterating over objects and free blocks, etc.
// A space in which the free area is contiguous. It therefore supports
// faster allocation, and compaction.
//
// Invariant: bottom() and end() are on page_size boundaries and
// bottom() <= top() <= end()
// top() is inclusive and end() is exclusive.
class ContiguousSpace: public CHeapObj<mtGC> {
friend class VMStructs;
private:
HeapWord* _bottom;
HeapWord* _end;
HeapWord* _top;
// Allocation helpers (return null if full).
inline HeapWord* allocate_impl(size_t word_size);
inline HeapWord* par_allocate_impl(size_t word_size);
public:
ContiguousSpace();
// Accessors
HeapWord* bottom() const { return _bottom; }
HeapWord* end() const { return _end; }
HeapWord* top() const { return _top; }
void set_bottom(HeapWord* value) { _bottom = value; }
void set_end(HeapWord* value) { _end = value; }
void set_top(HeapWord* value) { _top = value; }
// Testers
bool is_empty() const { return used() == 0; }
// Returns true iff the given the space contains the
// given address as part of an allocated object. For
// certain kinds of spaces, this might be a potentially
// expensive operation. To prevent performance problems
// on account of its inadvertent use in product jvm's,
// we restrict its use to assertion checks only.
bool is_in(const void* p) const {
return used_region().contains(p);
}
// Returns true iff the given reserved memory of the space contains the
// given address.
bool is_in_reserved(const void* p) const { return _bottom <= p && p < _end; }
// Size computations. Sizes are in bytes.
size_t capacity() const { return byte_size(bottom(), end()); }
size_t used() const { return byte_size(bottom(), top()); }
size_t free() const { return byte_size(top(), end()); }
void print() const;
void print_on(outputStream* st, const char* prefix) const;
// Initialization.
// "initialize" should be called once on a space, before it is used for
// any purpose. The "mr" arguments gives the bounds of the space, and
// the "clear_space" argument should be true unless the memory in "mr" is
// known to be zeroed.
void initialize(MemRegion mr, bool clear_space, bool mangle_space);
// The "clear" method must be called on a region that may have
// had allocation performed in it, but is now to be considered empty.
void clear(bool mangle_space);
void mangle_unused_area() PRODUCT_RETURN;
void mangle_unused_area(MemRegion mr) PRODUCT_RETURN;
MemRegion used_region() const { return MemRegion(bottom(), top()); }
// Allocation (return null if full). Assumes the caller has established
// mutually exclusive access to the space.
HeapWord* allocate(size_t word_size);
// Allocation (return null if full). Enforces mutual exclusion internally.
HeapWord* par_allocate(size_t word_size);
// Iteration
void object_iterate(ObjectClosure* blk);
// Addresses for inlined allocation
HeapWord** top_addr() { return &_top; }
// Debugging
void verify() const;
};
#endif // SHARE_GC_SHARED_SPACE_HPP