8171235: Move archive object code from G1MarkSweep into G1ArchiveAllocator
Reviewed-by: tschatzl, kbarrett
This commit is contained in:
parent
8f9584260e
commit
5ff4b1bb78
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2017, 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
|
||||
@ -27,7 +27,6 @@
|
||||
#include "gc/g1/g1AllocRegion.inline.hpp"
|
||||
#include "gc/g1/g1EvacStats.inline.hpp"
|
||||
#include "gc/g1/g1CollectedHeap.inline.hpp"
|
||||
#include "gc/g1/g1MarkSweep.hpp"
|
||||
#include "gc/g1/heapRegion.inline.hpp"
|
||||
#include "gc/g1/heapRegionSet.inline.hpp"
|
||||
|
||||
@ -333,11 +332,14 @@ void G1DefaultPLABAllocator::waste(size_t& wasted, size_t& undo_wasted) {
|
||||
}
|
||||
}
|
||||
|
||||
bool G1ArchiveAllocator::_archive_check_enabled = false;
|
||||
G1ArchiveRegionMap G1ArchiveAllocator::_archive_region_map;
|
||||
|
||||
G1ArchiveAllocator* G1ArchiveAllocator::create_allocator(G1CollectedHeap* g1h) {
|
||||
// Create the archive allocator, and also enable archive object checking
|
||||
// in mark-sweep, since we will be creating archive regions.
|
||||
G1ArchiveAllocator* result = new G1ArchiveAllocator(g1h);
|
||||
G1MarkSweep::enable_archive_object_check();
|
||||
enable_archive_object_check();
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -362,7 +364,7 @@ bool G1ArchiveAllocator::alloc_new_region() {
|
||||
_max = _bottom + HeapRegion::min_region_size_in_words();
|
||||
|
||||
// Tell mark-sweep that objects in this region are not to be marked.
|
||||
G1MarkSweep::set_range_archive(MemRegion(_bottom, HeapRegion::GrainWords), true);
|
||||
set_range_archive(MemRegion(_bottom, HeapRegion::GrainWords), true);
|
||||
|
||||
// Since we've modified the old set, call update_sizes.
|
||||
_g1h->g1mm()->update_sizes();
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2017, 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
|
||||
@ -312,12 +312,19 @@ public:
|
||||
virtual void waste(size_t& wasted, size_t& undo_wasted);
|
||||
};
|
||||
|
||||
// G1ArchiveRegionMap is a boolean array used to mark G1 regions as
|
||||
// archive regions. This allows a quick check for whether an object
|
||||
// should not be marked because it is in an archive region.
|
||||
class G1ArchiveRegionMap : public G1BiasedMappedArray<bool> {
|
||||
protected:
|
||||
bool default_value() const { return false; }
|
||||
};
|
||||
|
||||
// G1ArchiveAllocator is used to allocate memory in archive
|
||||
// regions. Such regions are not modifiable by GC, being neither
|
||||
// scavenged nor compacted, or even marked in the object header.
|
||||
// They can contain no pointers to non-archive heap regions,
|
||||
class G1ArchiveAllocator : public CHeapObj<mtGC> {
|
||||
|
||||
protected:
|
||||
G1CollectedHeap* _g1h;
|
||||
|
||||
@ -378,6 +385,24 @@ public:
|
||||
_summary_bytes_used = 0;
|
||||
}
|
||||
|
||||
// Create the _archive_region_map which is used to identify archive objects.
|
||||
static inline void enable_archive_object_check();
|
||||
|
||||
// Set the regions containing the specified address range as archive/non-archive.
|
||||
static inline void set_range_archive(MemRegion range, bool is_archive);
|
||||
|
||||
static inline bool is_archive_object(oop object);
|
||||
|
||||
private:
|
||||
static bool _archive_check_enabled;
|
||||
static G1ArchiveRegionMap _archive_region_map;
|
||||
|
||||
// Check if an object is in an archive region using the _archive_region_map.
|
||||
static inline bool in_archive_range(oop object);
|
||||
|
||||
// Check if archive object checking is enabled, to avoid calling in_archive_range
|
||||
// unnecessarily.
|
||||
static inline bool archive_check_enabled();
|
||||
};
|
||||
|
||||
#endif // SHARE_VM_GC_G1_G1ALLOCATOR_HPP
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, 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
|
||||
@ -55,4 +55,37 @@ inline HeapWord* G1PLABAllocator::plab_allocate(InCSetState dest,
|
||||
}
|
||||
}
|
||||
|
||||
// Create the _archive_region_map which is used to identify archive objects.
|
||||
inline void G1ArchiveAllocator::enable_archive_object_check() {
|
||||
assert(!_archive_check_enabled, "archive range check already enabled");
|
||||
_archive_check_enabled = true;
|
||||
size_t length = Universe::heap()->max_capacity();
|
||||
_archive_region_map.initialize((HeapWord*)Universe::heap()->base(),
|
||||
(HeapWord*)Universe::heap()->base() + length,
|
||||
HeapRegion::GrainBytes);
|
||||
}
|
||||
|
||||
// Set the regions containing the specified address range as archive/non-archive.
|
||||
inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool is_archive) {
|
||||
assert(_archive_check_enabled, "archive range check not enabled");
|
||||
_archive_region_map.set_by_address(range, is_archive);
|
||||
}
|
||||
|
||||
// Check if an object is in an archive region using the _archive_region_map.
|
||||
inline bool G1ArchiveAllocator::in_archive_range(oop object) {
|
||||
// This is the out-of-line part of is_archive_object test, done separately
|
||||
// to avoid additional performance impact when the check is not enabled.
|
||||
return _archive_region_map.get_by_address((HeapWord*)object);
|
||||
}
|
||||
|
||||
// Check if archive object checking is enabled, to avoid calling in_archive_range
|
||||
// unnecessarily.
|
||||
inline bool G1ArchiveAllocator::archive_check_enabled() {
|
||||
return _archive_check_enabled;
|
||||
}
|
||||
|
||||
inline bool G1ArchiveAllocator::is_archive_object(oop object) {
|
||||
return (archive_check_enabled() && in_archive_range(object));
|
||||
}
|
||||
|
||||
#endif // SHARE_VM_GC_G1_G1ALLOCATOR_HPP
|
||||
|
@ -699,9 +699,9 @@ bool G1CollectedHeap::alloc_archive_regions(MemRegion* ranges, size_t count) {
|
||||
// when mmap'ing archived heap data in, so pre-touching is wasted.
|
||||
FlagSetting fs(AlwaysPreTouch, false);
|
||||
|
||||
// Enable archive object checking in G1MarkSweep. We have to let it know
|
||||
// Enable archive object checking used by G1MarkSweep. We have to let it know
|
||||
// about each archive range, so that objects in those ranges aren't marked.
|
||||
G1MarkSweep::enable_archive_object_check();
|
||||
G1ArchiveAllocator::enable_archive_object_check();
|
||||
|
||||
// For each specified MemRegion range, allocate the corresponding G1
|
||||
// regions and mark them as archive regions. We expect the ranges in
|
||||
@ -773,7 +773,7 @@ bool G1CollectedHeap::alloc_archive_regions(MemRegion* ranges, size_t count) {
|
||||
}
|
||||
|
||||
// Notify mark-sweep of the archive range.
|
||||
G1MarkSweep::set_range_archive(curr_range, true);
|
||||
G1ArchiveAllocator::set_range_archive(curr_range, true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -924,7 +924,7 @@ void G1CollectedHeap::dealloc_archive_regions(MemRegion* ranges, size_t count) {
|
||||
}
|
||||
|
||||
// Notify mark-sweep that this is no longer an archive range.
|
||||
G1MarkSweep::set_range_archive(ranges[i], false);
|
||||
G1ArchiveAllocator::set_range_archive(ranges[i], false);
|
||||
}
|
||||
|
||||
if (uncommitted_regions != 0) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2017, 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
|
||||
@ -25,10 +25,10 @@
|
||||
#include "precompiled.hpp"
|
||||
#include "logging/log.hpp"
|
||||
#include "gc/g1/concurrentMarkThread.hpp"
|
||||
#include "gc/g1/g1Allocator.inline.hpp"
|
||||
#include "gc/g1/g1CollectedHeap.hpp"
|
||||
#include "gc/g1/g1CollectedHeap.inline.hpp"
|
||||
#include "gc/g1/g1HeapVerifier.hpp"
|
||||
#include "gc/g1/g1MarkSweep.hpp"
|
||||
#include "gc/g1/g1Policy.hpp"
|
||||
#include "gc/g1/g1RemSet.hpp"
|
||||
#include "gc/g1/g1RootProcessor.hpp"
|
||||
@ -239,7 +239,7 @@ public:
|
||||
|
||||
template <class T> void do_oop_work(T *p) {
|
||||
oop obj = oopDesc::load_decode_heap_oop(p);
|
||||
guarantee(obj == NULL || G1MarkSweep::in_archive_range(obj),
|
||||
guarantee(obj == NULL || G1ArchiveAllocator::is_archive_object(obj),
|
||||
"Archive object at " PTR_FORMAT " references a non-archive object at " PTR_FORMAT,
|
||||
p2i(p), p2i(obj));
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2017, 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
|
||||
@ -56,9 +56,6 @@
|
||||
|
||||
class HeapRegion;
|
||||
|
||||
bool G1MarkSweep::_archive_check_enabled = false;
|
||||
G1ArchiveRegionMap G1MarkSweep::_archive_region_map;
|
||||
|
||||
void G1MarkSweep::invoke_at_safepoint(ReferenceProcessor* rp,
|
||||
bool clear_all_softrefs) {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
|
||||
@ -314,26 +311,6 @@ void G1MarkSweep::mark_sweep_phase4() {
|
||||
|
||||
}
|
||||
|
||||
void G1MarkSweep::enable_archive_object_check() {
|
||||
assert(!_archive_check_enabled, "archive range check already enabled");
|
||||
_archive_check_enabled = true;
|
||||
size_t length = Universe::heap()->max_capacity();
|
||||
_archive_region_map.initialize((HeapWord*)Universe::heap()->base(),
|
||||
(HeapWord*)Universe::heap()->base() + length,
|
||||
HeapRegion::GrainBytes);
|
||||
}
|
||||
|
||||
void G1MarkSweep::set_range_archive(MemRegion range, bool is_archive) {
|
||||
assert(_archive_check_enabled, "archive range check not enabled");
|
||||
_archive_region_map.set_by_address(range, is_archive);
|
||||
}
|
||||
|
||||
bool G1MarkSweep::in_archive_range(oop object) {
|
||||
// This is the out-of-line part of is_archive_object test, done separately
|
||||
// to avoid additional performance impact when the check is not enabled.
|
||||
return _archive_region_map.get_by_address((HeapWord*)object);
|
||||
}
|
||||
|
||||
void G1MarkSweep::prepare_compaction_work(G1PrepareCompactClosure* blk) {
|
||||
G1CollectedHeap* g1h = G1CollectedHeap::heap();
|
||||
g1h->heap_region_iterate(blk);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2017, 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
|
||||
@ -55,23 +55,7 @@ class G1MarkSweep : AllStatic {
|
||||
static STWGCTimer* gc_timer() { return GenMarkSweep::_gc_timer; }
|
||||
static SerialOldTracer* gc_tracer() { return GenMarkSweep::_gc_tracer; }
|
||||
|
||||
// Create the _archive_region_map which is used to identify archive objects.
|
||||
static void enable_archive_object_check();
|
||||
|
||||
// Set the regions containing the specified address range as archive/non-archive.
|
||||
static void set_range_archive(MemRegion range, bool is_archive);
|
||||
|
||||
// Check if an object is in an archive region using the _archive_region_map.
|
||||
static bool in_archive_range(oop object);
|
||||
|
||||
// Check if archive object checking is enabled, to avoid calling in_archive_range
|
||||
// unnecessarily.
|
||||
static bool archive_check_enabled() { return G1MarkSweep::_archive_check_enabled; }
|
||||
|
||||
private:
|
||||
static bool _archive_check_enabled;
|
||||
static G1ArchiveRegionMap _archive_region_map;
|
||||
|
||||
private:
|
||||
// Mark live objects
|
||||
static void mark_sweep_phase1(bool& marked_for_deopt,
|
||||
bool clear_all_softrefs);
|
||||
@ -109,12 +93,4 @@ class G1PrepareCompactClosure : public HeapRegionClosure {
|
||||
bool doHeapRegion(HeapRegion* hr);
|
||||
};
|
||||
|
||||
// G1ArchiveRegionMap is a boolean array used to mark G1 regions as
|
||||
// archive regions. This allows a quick check for whether an object
|
||||
// should not be marked because it is in an archive region.
|
||||
class G1ArchiveRegionMap : public G1BiasedMappedArray<bool> {
|
||||
protected:
|
||||
bool default_value() const { return false; }
|
||||
};
|
||||
|
||||
#endif // SHARE_VM_GC_G1_G1MARKSWEEP_HPP
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2017, 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
|
||||
@ -30,13 +30,12 @@
|
||||
#include "oops/markOop.inline.hpp"
|
||||
#include "oops/oop.inline.hpp"
|
||||
#if INCLUDE_ALL_GCS
|
||||
#include "gc/g1/g1MarkSweep.hpp"
|
||||
#include "gc/g1/g1Allocator.inline.hpp"
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
|
||||
inline bool MarkSweep::is_archive_object(oop object) {
|
||||
#if INCLUDE_ALL_GCS
|
||||
return (G1MarkSweep::archive_check_enabled() &&
|
||||
G1MarkSweep::in_archive_range(object));
|
||||
return G1ArchiveAllocator::is_archive_object(object);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user