29 #include "gc_implementation/shared/gcStats.hpp" |
29 #include "gc_implementation/shared/gcStats.hpp" |
30 #include "gc_implementation/shared/generationCounters.hpp" |
30 #include "gc_implementation/shared/generationCounters.hpp" |
31 #include "memory/generation.hpp" |
31 #include "memory/generation.hpp" |
32 #include "utilities/macros.hpp" |
32 #include "utilities/macros.hpp" |
33 |
33 |
34 // TenuredGeneration models the heap containing old (promoted/tenured) objects. |
34 // TenuredGeneration models the heap containing old (promoted/tenured) objects |
|
35 // contained in a single contiguous space. |
|
36 // |
|
37 // Garbage collection is performed using mark-compact. |
35 |
38 |
36 class TenuredGeneration: public OneContigSpaceCardGeneration { |
39 class TenuredGeneration: public CardGeneration { |
37 friend class VMStructs; |
40 friend class VMStructs; |
|
41 // Abstractly, this is a subtype that gets access to protected fields. |
|
42 friend class VM_PopulateDumpSharedSpace; |
|
43 |
38 protected: |
44 protected: |
|
45 ContiguousSpace* _the_space; // actual space holding objects |
|
46 WaterMark _last_gc; // watermark between objects allocated before |
|
47 // and after last GC. |
|
48 |
39 GenerationCounters* _gen_counters; |
49 GenerationCounters* _gen_counters; |
40 CSpaceCounters* _space_counters; |
50 CSpaceCounters* _space_counters; |
41 |
51 |
|
52 // Grow generation with specified size (returns false if unable to grow) |
|
53 virtual bool grow_by(size_t bytes); |
|
54 // Grow generation to reserved size. |
|
55 virtual bool grow_to_reserved(); |
|
56 // Shrink generation with specified size (returns false if unable to shrink) |
|
57 void shrink_by(size_t bytes); |
|
58 |
|
59 // Allocation failure |
|
60 virtual bool expand(size_t bytes, size_t expand_bytes); |
|
61 void shrink(size_t bytes); |
|
62 |
|
63 // Accessing spaces |
|
64 ContiguousSpace* the_space() const { return _the_space; } |
|
65 |
42 public: |
66 public: |
43 TenuredGeneration(ReservedSpace rs, size_t initial_byte_size, int level, |
67 TenuredGeneration(ReservedSpace rs, size_t initial_byte_size, |
44 GenRemSet* remset); |
68 int level, GenRemSet* remset); |
45 |
69 |
46 Generation::Name kind() { return Generation::MarkSweepCompact; } |
70 Generation::Name kind() { return Generation::MarkSweepCompact; } |
47 |
71 |
48 // Printing |
72 // Printing |
49 const char* name() const { return "tenured generation"; } |
73 const char* name() const { return "tenured generation"; } |
55 // set. |
79 // set. |
56 virtual bool full_collects_younger_generations() const { |
80 virtual bool full_collects_younger_generations() const { |
57 return !ScavengeBeforeFullGC; |
81 return !ScavengeBeforeFullGC; |
58 } |
82 } |
59 |
83 |
|
84 inline bool is_in(const void* p) const; |
|
85 |
|
86 // Space enquiries |
|
87 size_t capacity() const; |
|
88 size_t used() const; |
|
89 size_t free() const; |
|
90 |
|
91 MemRegion used_region() const; |
|
92 |
|
93 size_t unsafe_max_alloc_nogc() const; |
|
94 size_t contiguous_available() const; |
|
95 |
|
96 // Iteration |
|
97 void object_iterate(ObjectClosure* blk); |
|
98 void space_iterate(SpaceClosure* blk, bool usedOnly = false); |
|
99 |
|
100 void younger_refs_iterate(OopsInGenClosure* blk); |
|
101 |
|
102 inline CompactibleSpace* first_compaction_space() const; |
|
103 |
|
104 virtual inline HeapWord* allocate(size_t word_size, bool is_tlab); |
|
105 virtual inline HeapWord* par_allocate(size_t word_size, bool is_tlab); |
|
106 |
|
107 // Accessing marks |
|
108 inline WaterMark top_mark(); |
|
109 inline WaterMark bottom_mark(); |
|
110 |
|
111 #define TenuredGen_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \ |
|
112 void oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl); |
|
113 TenuredGen_SINCE_SAVE_MARKS_DECL(OopsInGenClosure,_v) |
|
114 SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(TenuredGen_SINCE_SAVE_MARKS_DECL) |
|
115 |
|
116 void save_marks(); |
|
117 void reset_saved_marks(); |
|
118 bool no_allocs_since_save_marks(); |
|
119 |
|
120 inline size_t block_size(const HeapWord* addr) const; |
|
121 |
|
122 inline bool block_is_obj(const HeapWord* addr) const; |
|
123 |
|
124 virtual void collect(bool full, |
|
125 bool clear_all_soft_refs, |
|
126 size_t size, |
|
127 bool is_tlab); |
|
128 HeapWord* expand_and_allocate(size_t size, |
|
129 bool is_tlab, |
|
130 bool parallel = false); |
|
131 |
|
132 virtual void prepare_for_verify(); |
|
133 |
|
134 |
60 virtual void gc_prologue(bool full); |
135 virtual void gc_prologue(bool full); |
|
136 virtual void gc_epilogue(bool full); |
61 bool should_collect(bool full, |
137 bool should_collect(bool full, |
62 size_t word_size, |
138 size_t word_size, |
63 bool is_tlab); |
139 bool is_tlab); |
64 |
140 |
65 virtual void compute_new_size(); |
141 virtual void compute_new_size(); |
66 |
142 |
67 // Performance Counter support |
143 // Performance Counter support |
68 void update_counters(); |
144 void update_counters(); |
69 |
145 |
|
146 virtual void record_spaces_top(); |
|
147 |
70 // Statistics |
148 // Statistics |
71 |
149 |
72 virtual void update_gc_stats(int level, bool full); |
150 virtual void update_gc_stats(int level, bool full); |
73 |
151 |
74 virtual bool promotion_attempt_is_safe(size_t max_promoted_in_bytes) const; |
152 virtual bool promotion_attempt_is_safe(size_t max_promoted_in_bytes) const; |
|
153 |
|
154 virtual void verify(); |
|
155 virtual void print_on(outputStream* st) const; |
75 }; |
156 }; |
76 |
157 |
77 #endif // SHARE_VM_MEMORY_TENUREDGENERATION_HPP |
158 #endif // SHARE_VM_MEMORY_TENUREDGENERATION_HPP |