8198528: Move GenerationSpecs from GenCollectorPolicy to GenCollectedHeap

Reviewed-by: pliden, sjohanss, kbarrett
This commit is contained in:
Stefan Karlsson 2018-02-22 18:37:23 +01:00
parent 5f4f3883d8
commit 5671589a10
11 changed files with 57 additions and 65 deletions

View file

@ -52,13 +52,6 @@ void ConcurrentMarkSweepPolicy::initialize_alignments() {
_heap_alignment = compute_heap_alignment(); _heap_alignment = compute_heap_alignment();
} }
void ConcurrentMarkSweepPolicy::initialize_generations() {
_young_gen_spec = new GenerationSpec(Generation::ParNew, _initial_young_size,
_max_young_size, _gen_alignment);
_old_gen_spec = new GenerationSpec(Generation::ConcurrentMarkSweep,
_initial_old_size, _max_old_size, _gen_alignment);
}
void ConcurrentMarkSweepPolicy::initialize_gc_policy_counters() { void ConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {
// initialize the policy counters - 2 collectors, 2 generations // initialize the policy counters - 2 collectors, 2 generations
_gc_policy_counters = new GCPolicyCounters("ParNew:CMS", 2, 2); _gc_policy_counters = new GCPolicyCounters("ParNew:CMS", 2, 2);

View file

@ -30,7 +30,6 @@
class ConcurrentMarkSweepPolicy : public GenCollectorPolicy { class ConcurrentMarkSweepPolicy : public GenCollectorPolicy {
protected: protected:
void initialize_alignments(); void initialize_alignments();
void initialize_generations();
public: public:
ConcurrentMarkSweepPolicy() {} ConcurrentMarkSweepPolicy() {}

View file

@ -64,7 +64,12 @@ public:
}; };
CMSHeap::CMSHeap(GenCollectorPolicy *policy) : CMSHeap::CMSHeap(GenCollectorPolicy *policy) :
GenCollectedHeap(policy), _eden_pool(NULL), _survivor_pool(NULL), _old_pool(NULL) { GenCollectedHeap(policy,
Generation::ParNew,
Generation::ConcurrentMarkSweep),
_eden_pool(NULL),
_survivor_pool(NULL),
_old_pool(NULL) {
_workers = new WorkGang("GC Thread", ParallelGCThreads, _workers = new WorkGang("GC Thread", ParallelGCThreads,
/* are_GC_task_threads */true, /* are_GC_task_threads */true,
/* are_ConcurrentGC_threads */false); /* are_ConcurrentGC_threads */false);

View file

@ -29,7 +29,12 @@
#include "services/memoryManager.hpp" #include "services/memoryManager.hpp"
SerialHeap::SerialHeap(GenCollectorPolicy* policy) : SerialHeap::SerialHeap(GenCollectorPolicy* policy) :
GenCollectedHeap(policy), _eden_pool(NULL), _survivor_pool(NULL), _old_pool(NULL) { GenCollectedHeap(policy,
Generation::DefNew,
Generation::MarkSweepCompact),
_eden_pool(NULL),
_survivor_pool(NULL),
_old_pool(NULL) {
_young_manager = new GCMemoryManager("Copy", "end of minor GC"); _young_manager = new GCMemoryManager("Copy", "end of minor GC");
_old_manager = new GCMemoryManager("MarkSweepCompact", "end of major GC"); _old_manager = new GCMemoryManager("MarkSweepCompact", "end of major GC");
} }

View file

@ -170,9 +170,7 @@ GenCollectorPolicy::GenCollectorPolicy() :
_min_old_size(0), _min_old_size(0),
_initial_old_size(0), _initial_old_size(0),
_max_old_size(0), _max_old_size(0),
_gen_alignment(0), _gen_alignment(0)
_young_gen_spec(NULL),
_old_gen_spec(NULL)
{} {}
size_t GenCollectorPolicy::scale_by_NewRatio_aligned(size_t base_size) { size_t GenCollectorPolicy::scale_by_NewRatio_aligned(size_t base_size) {
@ -549,11 +547,6 @@ void MarkSweepPolicy::initialize_alignments() {
_heap_alignment = compute_heap_alignment(); _heap_alignment = compute_heap_alignment();
} }
void MarkSweepPolicy::initialize_generations() {
_young_gen_spec = new GenerationSpec(Generation::DefNew, _initial_young_size, _max_young_size, _gen_alignment);
_old_gen_spec = new GenerationSpec(Generation::MarkSweepCompact, _initial_old_size, _max_old_size, _gen_alignment);
}
void MarkSweepPolicy::initialize_gc_policy_counters() { void MarkSweepPolicy::initialize_gc_policy_counters() {
// Initialize the policy counters - 2 collectors, 2 generations. // Initialize the policy counters - 2 collectors, 2 generations.
_gc_policy_counters = new GCPolicyCounters("Copy:MSC", 2, 2); _gc_policy_counters = new GCPolicyCounters("Copy:MSC", 2, 2);

View file

@ -75,7 +75,7 @@ class CollectorPolicy : public CHeapObj<mtGC> {
CollectorPolicy(); CollectorPolicy();
public: public:
virtual void initialize_all() { void initialize_all() {
initialize_alignments(); initialize_alignments();
initialize_flags(); initialize_flags();
initialize_size_info(); initialize_size_info();
@ -108,9 +108,6 @@ protected:
// time. When using large pages they can differ. // time. When using large pages they can differ.
size_t _gen_alignment; size_t _gen_alignment;
GenerationSpec* _young_gen_spec;
GenerationSpec* _old_gen_spec;
GCPolicyCounters* _gc_policy_counters; GCPolicyCounters* _gc_policy_counters;
void initialize_flags(); void initialize_flags();
@ -142,29 +139,12 @@ protected:
size_t initial_old_size() { return _initial_old_size; } size_t initial_old_size() { return _initial_old_size; }
size_t max_old_size() { return _max_old_size; } size_t max_old_size() { return _max_old_size; }
GenerationSpec* young_gen_spec() const {
assert(_young_gen_spec != NULL, "_young_gen_spec should have been initialized");
return _young_gen_spec;
}
GenerationSpec* old_gen_spec() const {
assert(_old_gen_spec != NULL, "_old_gen_spec should have been initialized");
return _old_gen_spec;
}
// Performance Counter support // Performance Counter support
GCPolicyCounters* counters() { return _gc_policy_counters; } GCPolicyCounters* counters() { return _gc_policy_counters; }
// Create the jstat counters for the GC policy. // Create the jstat counters for the GC policy.
virtual void initialize_gc_policy_counters() = 0; virtual void initialize_gc_policy_counters() = 0;
virtual void initialize_generations() { };
virtual void initialize_all() {
CollectorPolicy::initialize_all();
initialize_generations();
}
size_t young_gen_size_lower_bound(); size_t young_gen_size_lower_bound();
size_t old_gen_size_lower_bound(); size_t old_gen_size_lower_bound();
@ -173,7 +153,6 @@ protected:
class MarkSweepPolicy : public GenCollectorPolicy { class MarkSweepPolicy : public GenCollectorPolicy {
protected: protected:
void initialize_alignments(); void initialize_alignments();
void initialize_generations();
public: public:
MarkSweepPolicy() {} MarkSweepPolicy() {}

View file

@ -62,15 +62,23 @@
#include "utilities/stack.inline.hpp" #include "utilities/stack.inline.hpp"
#include "utilities/vmError.hpp" #include "utilities/vmError.hpp"
GenCollectedHeap::GenCollectedHeap(GenCollectorPolicy *policy) : GenCollectedHeap::GenCollectedHeap(GenCollectorPolicy *policy,
Generation::Name young,
Generation::Name old) :
CollectedHeap(), CollectedHeap(),
_rem_set(NULL), _rem_set(NULL),
_young_gen_spec(new GenerationSpec(young,
policy->initial_young_size(),
policy->max_young_size(),
policy->gen_alignment())),
_old_gen_spec(new GenerationSpec(old,
policy->initial_old_size(),
policy->max_old_size(),
policy->gen_alignment())),
_gen_policy(policy), _gen_policy(policy),
_soft_ref_gen_policy(), _soft_ref_gen_policy(),
_process_strong_tasks(new SubTasksDone(GCH_PS_NumElements)), _process_strong_tasks(new SubTasksDone(GCH_PS_NumElements)),
_full_collections_completed(0) _full_collections_completed(0) {
{
assert(policy != NULL, "Sanity check");
} }
jint GenCollectedHeap::initialize() { jint GenCollectedHeap::initialize() {
@ -101,12 +109,12 @@ jint GenCollectedHeap::initialize() {
_rem_set = new CardTableRS(reserved_region()); _rem_set = new CardTableRS(reserved_region());
set_barrier_set(rem_set()->bs()); set_barrier_set(rem_set()->bs());
ReservedSpace young_rs = heap_rs.first_part(gen_policy()->young_gen_spec()->max_size(), false, false); ReservedSpace young_rs = heap_rs.first_part(_young_gen_spec->max_size(), false, false);
_young_gen = gen_policy()->young_gen_spec()->init(young_rs, rem_set()); _young_gen = _young_gen_spec->init(young_rs, rem_set());
heap_rs = heap_rs.last_part(gen_policy()->young_gen_spec()->max_size()); heap_rs = heap_rs.last_part(_young_gen_spec->max_size());
ReservedSpace old_rs = heap_rs.first_part(gen_policy()->old_gen_spec()->max_size(), false, false); ReservedSpace old_rs = heap_rs.first_part(_old_gen_spec->max_size(), false, false);
_old_gen = gen_policy()->old_gen_spec()->init(old_rs, rem_set()); _old_gen = _old_gen_spec->init(old_rs, rem_set());
clear_incremental_collection_failed(); clear_incremental_collection_failed();
return JNI_OK; return JNI_OK;
@ -129,12 +137,9 @@ char* GenCollectedHeap::allocate(size_t alignment,
const size_t pageSize = UseLargePages ? os::large_page_size() : os::vm_page_size(); const size_t pageSize = UseLargePages ? os::large_page_size() : os::vm_page_size();
assert(alignment % pageSize == 0, "Must be"); assert(alignment % pageSize == 0, "Must be");
GenerationSpec* young_spec = gen_policy()->young_gen_spec();
GenerationSpec* old_spec = gen_policy()->old_gen_spec();
// Check for overflow. // Check for overflow.
size_t total_reserved = young_spec->max_size() + old_spec->max_size(); size_t total_reserved = _young_gen_spec->max_size() + _old_gen_spec->max_size();
if (total_reserved < young_spec->max_size()) { if (total_reserved < _young_gen_spec->max_size()) {
vm_exit_during_initialization("The size of the object heap + VM data exceeds " vm_exit_during_initialization("The size of the object heap + VM data exceeds "
"the maximum representable size"); "the maximum representable size");
} }
@ -172,6 +177,14 @@ void GenCollectedHeap::ref_processing_init() {
_old_gen->ref_processor_init(); _old_gen->ref_processor_init();
} }
GenerationSpec* GenCollectedHeap::young_gen_spec() const {
return _young_gen_spec;
}
GenerationSpec* GenCollectedHeap::old_gen_spec() const {
return _old_gen_spec;
}
size_t GenCollectedHeap::capacity() const { size_t GenCollectedHeap::capacity() const {
return _young_gen->capacity() + _old_gen->capacity(); return _young_gen->capacity() + _old_gen->capacity();
} }

View file

@ -31,6 +31,7 @@
#include "gc/shared/softRefGenPolicy.hpp" #include "gc/shared/softRefGenPolicy.hpp"
class AdaptiveSizePolicy; class AdaptiveSizePolicy;
class GenerationSpec;
class StrongRootsScope; class StrongRootsScope;
class SubTasksDone; class SubTasksDone;
class WorkGang; class WorkGang;
@ -65,6 +66,9 @@ private:
Generation* _young_gen; Generation* _young_gen;
Generation* _old_gen; Generation* _old_gen;
GenerationSpec* _young_gen_spec;
GenerationSpec* _old_gen_spec;
// The singleton CardTable Remembered Set. // The singleton CardTable Remembered Set.
CardTableRS* _rem_set; CardTableRS* _rem_set;
@ -149,7 +153,9 @@ protected:
// we absolutely __must__ clear soft refs? // we absolutely __must__ clear soft refs?
bool must_clear_all_soft_refs(); bool must_clear_all_soft_refs();
GenCollectedHeap(GenCollectorPolicy *policy); GenCollectedHeap(GenCollectorPolicy *policy,
Generation::Name young,
Generation::Name old);
virtual void check_gen_kinds() = 0; virtual void check_gen_kinds() = 0;
@ -171,6 +177,9 @@ public:
bool is_young_gen(const Generation* gen) const { return gen == _young_gen; } bool is_young_gen(const Generation* gen) const { return gen == _young_gen; }
bool is_old_gen(const Generation* gen) const { return gen == _old_gen; } bool is_old_gen(const Generation* gen) const { return gen == _old_gen; }
GenerationSpec* young_gen_spec() const;
GenerationSpec* old_gen_spec() const;
// The generational collector policy. // The generational collector policy.
GenCollectorPolicy* gen_policy() const { return _gen_policy; } GenCollectorPolicy* gen_policy() const { return _gen_policy; }

View file

@ -63,9 +63,9 @@ Generation::Generation(ReservedSpace rs, size_t initial_size) :
size_t Generation::initial_size() { size_t Generation::initial_size() {
GenCollectedHeap* gch = GenCollectedHeap::heap(); GenCollectedHeap* gch = GenCollectedHeap::heap();
if (gch->is_young_gen(this)) { if (gch->is_young_gen(this)) {
return gch->gen_policy()->young_gen_spec()->init_size(); return gch->young_gen_spec()->init_size();
} }
return gch->gen_policy()->old_gen_spec()->init_size(); return gch->old_gen_spec()->init_size();
} }
size_t Generation::max_capacity() const { size_t Generation::max_capacity() const {

View file

@ -514,9 +514,8 @@ typedef PaddedEnd<ObjectMonitor> PaddedObjectMonitor;
\ \
nonstatic_field(GenCollectedHeap, _young_gen, Generation*) \ nonstatic_field(GenCollectedHeap, _young_gen, Generation*) \
nonstatic_field(GenCollectedHeap, _old_gen, Generation*) \ nonstatic_field(GenCollectedHeap, _old_gen, Generation*) \
\ nonstatic_field(GenCollectedHeap, _young_gen_spec, GenerationSpec*) \
nonstatic_field(GenCollectorPolicy, _young_gen_spec, GenerationSpec*) \ nonstatic_field(GenCollectedHeap, _old_gen_spec, GenerationSpec*) \
nonstatic_field(GenCollectorPolicy, _old_gen_spec, GenerationSpec*) \
\ \
nonstatic_field(HeapWord, i, char*) \ nonstatic_field(HeapWord, i, char*) \
\ \
@ -1470,7 +1469,6 @@ typedef PaddedEnd<ObjectMonitor> PaddedObjectMonitor;
declare_type(DefNewGeneration, Generation) \ declare_type(DefNewGeneration, Generation) \
declare_type(CardGeneration, Generation) \ declare_type(CardGeneration, Generation) \
declare_type(TenuredGeneration, CardGeneration) \ declare_type(TenuredGeneration, CardGeneration) \
declare_toplevel_type(GenCollectorPolicy) \
declare_toplevel_type(Space) \ declare_toplevel_type(Space) \
declare_type(CompactibleSpace, Space) \ declare_type(CompactibleSpace, Space) \
declare_type(ContiguousSpace, CompactibleSpace) \ declare_type(ContiguousSpace, CompactibleSpace) \

View file

@ -54,12 +54,10 @@ public class GenCollectedHeap extends CollectedHeap {
youngGenField = type.getAddressField("_young_gen"); youngGenField = type.getAddressField("_young_gen");
oldGenField = type.getAddressField("_old_gen"); oldGenField = type.getAddressField("_old_gen");
youngGenSpecField = type.getAddressField("_young_gen_spec");
oldGenSpecField = type.getAddressField("_old_gen_spec");
genFactory = new GenerationFactory(); genFactory = new GenerationFactory();
Type collectorPolicyType = db.lookupType("GenCollectorPolicy");
youngGenSpecField = collectorPolicyType.getAddressField("_young_gen_spec");
oldGenSpecField = collectorPolicyType.getAddressField("_old_gen_spec");
} }
public GenCollectedHeap(Address addr) { public GenCollectedHeap(Address addr) {