105 #endif // INCLUDE_CDS_JAVA_HEAP |
105 #endif // INCLUDE_CDS_JAVA_HEAP |
106 |
106 |
107 class HeapShared: AllStatic { |
107 class HeapShared: AllStatic { |
108 friend class VerifySharedOopClosure; |
108 friend class VerifySharedOopClosure; |
109 private: |
109 private: |
|
110 |
110 #if INCLUDE_CDS_JAVA_HEAP |
111 #if INCLUDE_CDS_JAVA_HEAP |
|
112 static bool _open_archive_heap_region_mapped; |
|
113 static bool _archive_heap_region_fixed; |
|
114 |
|
115 static bool oop_equals(oop const& p1, oop const& p2) { |
|
116 return oopDesc::equals(p1, p2); |
|
117 } |
|
118 static unsigned oop_hash(oop const& p); |
|
119 |
|
120 typedef ResourceHashtable<oop, oop, |
|
121 HeapShared::oop_hash, |
|
122 HeapShared::oop_equals, |
|
123 15889, // prime number |
|
124 ResourceObj::C_HEAP> ArchivedObjectCache; |
|
125 static ArchivedObjectCache* _archived_object_cache; |
111 |
126 |
112 static bool klass_equals(Klass* const& p1, Klass* const& p2) { |
127 static bool klass_equals(Klass* const& p1, Klass* const& p2) { |
113 return primitive_equals<Klass*>(p1, p2); |
128 return primitive_equals<Klass*>(p1, p2); |
114 } |
129 } |
115 |
130 |
162 |
177 |
163 // Used by decode_from_archive |
178 // Used by decode_from_archive |
164 static address _narrow_oop_base; |
179 static address _narrow_oop_base; |
165 static int _narrow_oop_shift; |
180 static int _narrow_oop_shift; |
166 |
181 |
167 static bool oop_equals(oop const& p1, oop const& p2) { |
|
168 return primitive_equals<oop>(p1, p2); |
|
169 } |
|
170 |
|
171 static unsigned oop_hash(oop const& p) { |
|
172 return primitive_hash<address>((address)p); |
|
173 } |
|
174 |
|
175 typedef ResourceHashtable<oop, bool, |
182 typedef ResourceHashtable<oop, bool, |
176 HeapShared::oop_hash, |
183 HeapShared::oop_hash, |
177 HeapShared::oop_equals, |
184 HeapShared::oop_equals, |
178 15889, // prime number |
185 15889, // prime number |
179 ResourceObj::C_HEAP> SeenObjectsTable; |
186 ResourceObj::C_HEAP> SeenObjectsTable; |
205 static void start_recording_subgraph(InstanceKlass *k, const char* klass_name); |
212 static void start_recording_subgraph(InstanceKlass *k, const char* klass_name); |
206 static void done_recording_subgraph(InstanceKlass *k, const char* klass_name); |
213 static void done_recording_subgraph(InstanceKlass *k, const char* klass_name); |
207 |
214 |
208 static bool has_been_seen_during_subgraph_recording(oop obj); |
215 static bool has_been_seen_during_subgraph_recording(oop obj); |
209 static void set_has_been_seen_during_subgraph_recording(oop obj); |
216 static void set_has_been_seen_during_subgraph_recording(oop obj); |
|
217 |
|
218 public: |
|
219 static void create_archived_object_cache() { |
|
220 _archived_object_cache = |
|
221 new (ResourceObj::C_HEAP, mtClass)ArchivedObjectCache(); |
|
222 } |
|
223 static void destroy_archived_object_cache() { |
|
224 delete _archived_object_cache; |
|
225 _archived_object_cache = NULL; |
|
226 } |
|
227 static ArchivedObjectCache* archived_object_cache() { |
|
228 return _archived_object_cache; |
|
229 } |
|
230 |
|
231 static oop find_archived_heap_object(oop obj); |
|
232 static oop archive_heap_object(oop obj, Thread* THREAD); |
|
233 static oop materialize_archived_object(narrowOop v); |
|
234 |
|
235 static void archive_klass_objects(Thread* THREAD); |
|
236 |
|
237 static void set_archive_heap_region_fixed() { |
|
238 _archive_heap_region_fixed = true; |
|
239 } |
|
240 static bool archive_heap_region_fixed() { |
|
241 return _archive_heap_region_fixed; |
|
242 } |
|
243 |
|
244 static void archive_java_heap_objects(GrowableArray<MemRegion> *closed, |
|
245 GrowableArray<MemRegion> *open); |
|
246 static void copy_closed_archive_heap_objects(GrowableArray<MemRegion> * closed_archive); |
|
247 static void copy_open_archive_heap_objects(GrowableArray<MemRegion> * open_archive); |
210 #endif // INCLUDE_CDS_JAVA_HEAP |
248 #endif // INCLUDE_CDS_JAVA_HEAP |
211 public: |
249 |
|
250 public: |
|
251 static bool is_heap_object_archiving_allowed() { |
|
252 CDS_JAVA_HEAP_ONLY(return (UseG1GC && UseCompressedOops && UseCompressedClassPointers);) |
|
253 NOT_CDS_JAVA_HEAP(return false;) |
|
254 } |
|
255 |
|
256 static void set_open_archive_heap_region_mapped() { |
|
257 CDS_JAVA_HEAP_ONLY(_open_archive_heap_region_mapped = true); |
|
258 NOT_CDS_JAVA_HEAP_RETURN; |
|
259 } |
|
260 static bool open_archive_heap_region_mapped() { |
|
261 CDS_JAVA_HEAP_ONLY(return _open_archive_heap_region_mapped); |
|
262 NOT_CDS_JAVA_HEAP_RETURN_(false); |
|
263 } |
|
264 |
|
265 static void fixup_mapped_heap_regions() NOT_CDS_JAVA_HEAP_RETURN; |
|
266 |
|
267 inline static bool is_archived_object(oop p) NOT_CDS_JAVA_HEAP_RETURN_(false); |
|
268 |
|
269 static void archive_java_heap_objects() NOT_CDS_JAVA_HEAP_RETURN; |
|
270 |
212 static char* read_archived_subgraph_infos(char* buffer) NOT_CDS_JAVA_HEAP_RETURN_(buffer); |
271 static char* read_archived_subgraph_infos(char* buffer) NOT_CDS_JAVA_HEAP_RETURN_(buffer); |
213 static void write_archived_subgraph_infos() NOT_CDS_JAVA_HEAP_RETURN; |
272 static void write_archived_subgraph_infos() NOT_CDS_JAVA_HEAP_RETURN; |
214 static void initialize_from_archived_subgraph(Klass* k) NOT_CDS_JAVA_HEAP_RETURN; |
273 static void initialize_from_archived_subgraph(Klass* k) NOT_CDS_JAVA_HEAP_RETURN; |
215 |
274 |
216 // NarrowOops stored in the CDS archive may use a different encoding scheme |
275 // NarrowOops stored in the CDS archive may use a different encoding scheme |
223 |
282 |
224 static void patch_archived_heap_embedded_pointers(MemRegion mem, address oopmap, |
283 static void patch_archived_heap_embedded_pointers(MemRegion mem, address oopmap, |
225 size_t oopmap_in_bits) NOT_CDS_JAVA_HEAP_RETURN; |
284 size_t oopmap_in_bits) NOT_CDS_JAVA_HEAP_RETURN; |
226 |
285 |
227 static void init_archivable_static_fields(Thread* THREAD) NOT_CDS_JAVA_HEAP_RETURN; |
286 static void init_archivable_static_fields(Thread* THREAD) NOT_CDS_JAVA_HEAP_RETURN; |
228 static void archive_static_fields(Thread* THREAD) NOT_CDS_JAVA_HEAP_RETURN; |
287 static void archive_object_subgraphs(Thread* THREAD) NOT_CDS_JAVA_HEAP_RETURN; |
229 static void write_subgraph_info_table() NOT_CDS_JAVA_HEAP_RETURN; |
288 static void write_subgraph_info_table() NOT_CDS_JAVA_HEAP_RETURN; |
230 static void serialize_subgraph_info_table_header(SerializeClosure* soc) NOT_CDS_JAVA_HEAP_RETURN; |
289 static void serialize_subgraph_info_table_header(SerializeClosure* soc) NOT_CDS_JAVA_HEAP_RETURN; |
231 |
290 |
232 #if INCLUDE_CDS_JAVA_HEAP |
291 #if INCLUDE_CDS_JAVA_HEAP |
233 static ResourceBitMap calculate_oopmap(MemRegion region); |
292 static ResourceBitMap calculate_oopmap(MemRegion region); |