< prev index next >

src/hotspot/share/cds/archiveBuilder.hpp

Print this page

128     bool _read_only;
129     bool _has_embedded_pointer;
130     FollowMode _follow_mode;
131     int _size_in_bytes;
132     int _id; // Each object has a unique serial ID, starting from zero. The ID is assigned
133              // when the object is added into _source_objs.
134     MetaspaceObj::Type _msotype;
135     address _source_addr;    // The source object to be copied.
136     address _buffered_addr;  // The copy of this object insider the buffer.
137   public:
138     SourceObjInfo(MetaspaceClosure::Ref* ref, bool read_only, FollowMode follow_mode) :
139       _ptrmap_start(0), _ptrmap_end(0), _read_only(read_only), _has_embedded_pointer(false), _follow_mode(follow_mode),
140       _size_in_bytes(ref->size() * BytesPerWord), _id(0), _msotype(ref->msotype()),
141       _source_addr(ref->obj()) {
142       if (follow_mode == point_to_it) {
143         _buffered_addr = ref->obj();
144       } else {
145         _buffered_addr = nullptr;
146       }
147     }




148 
149     // This constructor is only used for regenerated objects (created by LambdaFormInvokers, etc).
150     //   src = address of a Method or InstanceKlass that has been regenerated.
151     //   renegerated_obj_info = info for the regenerated version of src.
152     SourceObjInfo(address src, SourceObjInfo* renegerated_obj_info) :
153       _ptrmap_start(0), _ptrmap_end(0), _read_only(false),
154       _follow_mode(renegerated_obj_info->_follow_mode),
155       _size_in_bytes(0), _msotype(renegerated_obj_info->_msotype),
156       _source_addr(src),  _buffered_addr(renegerated_obj_info->_buffered_addr) {}
157 
158     bool should_copy() const { return _follow_mode == make_a_copy; }
159     void set_buffered_addr(address addr)  {
160       assert(should_copy(), "must be");
161       assert(_buffered_addr == nullptr, "cannot be copied twice");
162       assert(addr != nullptr, "must be a valid copy");
163       _buffered_addr = addr;
164     }
165     void set_ptrmap_start(uintx v) { _ptrmap_start = v;    }
166     void set_ptrmap_end(uintx v)   { _ptrmap_end = v;      }
167     uintx ptrmap_start()  const    { return _ptrmap_start; } // inclusive

194     GrowableArray<SourceObjInfo*>* objs() const { return _objs; }
195 
196     void append(SourceObjInfo* src_info);
197     void remember_embedded_pointer(SourceObjInfo* pointing_obj, MetaspaceClosure::Ref* ref);
198     void relocate(int i, ArchiveBuilder* builder);
199 
200     // convenience accessor
201     SourceObjInfo* at(int i) const { return objs()->at(i); }
202   };
203 
204   class CDSMapLogger;
205 
206   static const int INITIAL_TABLE_SIZE = 15889;
207   static const int MAX_TABLE_SIZE     = 1000000;
208 
209   ReservedSpace _shared_rs;
210   VirtualSpace _shared_vs;
211 
212   DumpRegion _rw_region;
213   DumpRegion _ro_region;

214 
215   // Combined bitmap to track pointers in both RW and RO regions. This is updated
216   // as objects are copied into RW and RO.
217   CHeapBitMap _ptrmap;
218 
219   // _ptrmap is split into these two bitmaps which are written into the archive.
220   CHeapBitMap _rw_ptrmap;   // marks pointers in the RW region
221   CHeapBitMap _ro_ptrmap;   // marks pointers in the RO region

222 
223   SourceObjList _rw_src_objs;                 // objs to put in rw region
224   SourceObjList _ro_src_objs;                 // objs to put in ro region
225   ResizeableResourceHashtable<address, SourceObjInfo, AnyObj::C_HEAP, mtClassShared> _src_obj_table;
226   ResizeableResourceHashtable<address, address, AnyObj::C_HEAP, mtClassShared> _buffered_to_src_table;
227   GrowableArray<Klass*>* _klasses;
228   GrowableArray<Symbol*>* _symbols;
229   unsigned int _entropy_seed;
230 
231   // statistics
232   DumpAllocStats _alloc_stats;
233   size_t _total_heap_region_size;
234 
235   void print_region_stats(FileMapInfo *map_info, ArchiveHeapInfo* heap_info);
236   void print_bitmap_region_stats(size_t size, size_t total_size);
237   void print_heap_region_stats(ArchiveHeapInfo* heap_info, size_t total_size);
238 
239   // For global access.
240   static ArchiveBuilder* _current;
241 
242 public:
243   // Use this when you allocate space outside of ArchiveBuilder::dump_{rw,ro}_region.
244   // These are usually for misc tables that are allocated in the RO space.
245   class OtherROAllocMark {
246     char* _oldtop;
247   public:
248     OtherROAllocMark() {
249       _oldtop = _current->_ro_region.top();
250     }
251     ~OtherROAllocMark();
252   };
253 
254 private:
255   FollowMode get_follow_mode(MetaspaceClosure::Ref *ref);
256 
257   void iterate_sorted_roots(MetaspaceClosure* it);
258   void sort_klasses();
259   static int compare_symbols_by_address(Symbol** a, Symbol** b);
260   static int compare_klass_by_name(Klass** a, Klass** b);

261 
262   void make_shallow_copies(DumpRegion *dump_region, const SourceObjList* src_objs);
263   void make_shallow_copy(DumpRegion *dump_region, SourceObjInfo* src_info);
264 
265   void relocate_embedded_pointers(SourceObjList* src_objs);
266 
267   bool is_excluded(Klass* k);
268   void clean_up_src_obj_table();
269 
270 protected:
271   virtual void iterate_roots(MetaspaceClosure* it) = 0;
272 
273   // Conservative estimate for number of bytes needed for:
274   size_t _estimated_metaspaceobj_bytes;   // all archived MetaspaceObj's.
275   size_t _estimated_hashtable_bytes;     // symbol table and dictionaries
276 
277   static const int _total_dump_regions = 2;
278 
279   size_t estimate_archive_size();
280 
281   void start_dump_region(DumpRegion* next);
282   void verify_estimate_size(size_t estimate, const char* which);
283 
284 public:
285   address reserve_buffer();
286 
287   address buffer_bottom()                    const { return _buffer_bottom;                        }
288   address buffer_top()                       const { return (address)current_dump_region()->top(); }
289   address requested_static_archive_bottom()  const { return  _requested_static_archive_bottom;     }
290   address mapped_static_archive_bottom()     const { return  _mapped_static_archive_bottom;        }
291   intx buffer_to_requested_delta()           const { return _buffer_to_requested_delta;            }
292 
293   bool is_in_buffer_space(address p) const {



294     return (buffer_bottom() <= p && p < buffer_top());
295   }
296 
297   template <typename T> bool is_in_requested_static_archive(T p) const {
298     return _requested_static_archive_bottom <= (address)p && (address)p < _requested_static_archive_top;
299   }
300 
301   template <typename T> bool is_in_mapped_static_archive(T p) const {
302     return _mapped_static_archive_bottom <= (address)p && (address)p < _mapped_static_archive_top;
303   }
304 
305   template <typename T> bool is_in_buffer_space(T obj) const {
306     return is_in_buffer_space(address(obj));
307   }
308 
309   template <typename T> T to_requested(T obj) const {
310     assert(is_in_buffer_space(obj), "must be");
311     return (T)(address(obj) + _buffer_to_requested_delta);
312   }
313 

326   // The address p points to an object inside the output buffer. When the archive is mapped
327   // at the requested address, what's the offset of this object from _requested_static_archive_bottom?
328   uintx buffer_to_offset(address p) const;
329 
330   // Same as buffer_to_offset, except that the address p points to either (a) an object
331   // inside the output buffer, or (b), an object in the currently mapped static archive.
332   uintx any_to_offset(address p) const;
333 
334   template <typename T>
335   u4 buffer_to_offset_u4(T p) const {
336     uintx offset = buffer_to_offset((address)p);
337     return to_offset_u4(offset);
338   }
339 
340   template <typename T>
341   u4 any_to_offset_u4(T p) const {
342     uintx offset = any_to_offset((address)p);
343     return to_offset_u4(offset);
344   }
345 
346   static void assert_is_vm_thread() PRODUCT_RETURN;
347 
348 public:
349   ArchiveBuilder();
350   ~ArchiveBuilder();
351 
352   int entropy();
353   void gather_klasses_and_symbols();
354   void gather_source_objs();
355   bool gather_klass_and_symbol(MetaspaceClosure::Ref* ref, bool read_only);
356   bool gather_one_source_obj(MetaspaceClosure::Ref* ref, bool read_only);
357   void remember_embedded_pointer_in_enclosing_obj(MetaspaceClosure::Ref* ref);
358   static void serialize_dynamic_archivable_items(SerializeClosure* soc);
359 
360   DumpRegion* rw_region() { return &_rw_region; }
361   DumpRegion* ro_region() { return &_ro_region; }




362 
363   static char* rw_region_alloc(size_t num_bytes) {
364     return current()->rw_region()->allocate(num_bytes);
365   }
366   static char* ro_region_alloc(size_t num_bytes) {
367     return current()->ro_region()->allocate(num_bytes);
368   }



369 
370   template <typename T>
371   static Array<T>* new_ro_array(int length) {
372     size_t byte_size = Array<T>::byte_sizeof(length, sizeof(T));
373     Array<T>* array = (Array<T>*)ro_region_alloc(byte_size);
374     array->initialize(length);
375     return array;
376   }
377 
378   template <typename T>
379   static Array<T>* new_rw_array(int length) {
380     size_t byte_size = Array<T>::byte_sizeof(length, sizeof(T));
381     Array<T>* array = (Array<T>*)rw_region_alloc(byte_size);
382     array->initialize(length);
383     return array;
384   }
385 
386   template <typename T>
387   static size_t ro_array_bytesize(int length) {
388     size_t byte_size = Array<T>::byte_sizeof(length, sizeof(T));
389     return align_up(byte_size, SharedSpaceObjectAlignment);
390   }
391 
392   char* ro_strdup(const char* s);
393 
394   static int compare_src_objs(SourceObjInfo** a, SourceObjInfo** b);
395   void sort_metadata_objs();
396   void dump_rw_metadata();
397   void dump_ro_metadata();
398   void relocate_metaspaceobj_embedded_pointers();
399   void record_regenerated_object(address orig_src_obj, address regen_src_obj);
400   void make_klasses_shareable();

401   void relocate_to_requested();
402   void write_archive(FileMapInfo* mapinfo, ArchiveHeapInfo* heap_info);
403   void write_region(FileMapInfo* mapinfo, int region_idx, DumpRegion* dump_region,
404                     bool read_only,  bool allow_exec);
405 
406   void write_pointer_in_buffer(address* ptr_location, address src_addr);
407   template <typename T> void write_pointer_in_buffer(T* ptr_location, T src_addr) {
408     write_pointer_in_buffer((address*)ptr_location, (address)src_addr);
409   }
410 






411   address get_buffered_addr(address src_addr) const;
412   template <typename T> T get_buffered_addr(T src_addr) const {
413     return (T)get_buffered_addr((address)src_addr);
414   }
415 
416   address get_source_addr(address buffered_addr) const;
417   template <typename T> T get_source_addr(T buffered_addr) const {
418     return (T)get_source_addr((address)buffered_addr);
419   }
420 
421   // All klasses and symbols that will be copied into the archive
422   GrowableArray<Klass*>*  klasses() const { return _klasses; }
423   GrowableArray<Symbol*>* symbols() const { return _symbols; }
424 
425   static bool is_active() {
426     return (_current != nullptr);

427   }
428 
429   static ArchiveBuilder* current() {
430     assert_is_vm_thread();
431     assert(_current != nullptr, "ArchiveBuilder must be active");
432     return _current;
433   }
434 
435   static DumpAllocStats* alloc_stats() {
436     return &(current()->_alloc_stats);
437   }
438 
439   static CompactHashtableStats* symbol_stats() {
440     return alloc_stats()->symbol_stats();
441   }
442 
443   static CompactHashtableStats* string_stats() {
444     return alloc_stats()->string_stats();
445   }
446 
447   narrowKlass get_requested_narrow_klass(Klass* k);
448 
449   static Klass* get_buffered_klass(Klass* src_klass) {
450     Klass* klass = (Klass*)current()->get_buffered_addr((address)src_klass);

128     bool _read_only;
129     bool _has_embedded_pointer;
130     FollowMode _follow_mode;
131     int _size_in_bytes;
132     int _id; // Each object has a unique serial ID, starting from zero. The ID is assigned
133              // when the object is added into _source_objs.
134     MetaspaceObj::Type _msotype;
135     address _source_addr;    // The source object to be copied.
136     address _buffered_addr;  // The copy of this object insider the buffer.
137   public:
138     SourceObjInfo(MetaspaceClosure::Ref* ref, bool read_only, FollowMode follow_mode) :
139       _ptrmap_start(0), _ptrmap_end(0), _read_only(read_only), _has_embedded_pointer(false), _follow_mode(follow_mode),
140       _size_in_bytes(ref->size() * BytesPerWord), _id(0), _msotype(ref->msotype()),
141       _source_addr(ref->obj()) {
142       if (follow_mode == point_to_it) {
143         _buffered_addr = ref->obj();
144       } else {
145         _buffered_addr = nullptr;
146       }
147     }
148     SourceObjInfo(address src, address buf) {
149       _source_addr = src;
150       _buffered_addr = buf;
151     }
152 
153     // This constructor is only used for regenerated objects (created by LambdaFormInvokers, etc).
154     //   src = address of a Method or InstanceKlass that has been regenerated.
155     //   renegerated_obj_info = info for the regenerated version of src.
156     SourceObjInfo(address src, SourceObjInfo* renegerated_obj_info) :
157       _ptrmap_start(0), _ptrmap_end(0), _read_only(false),
158       _follow_mode(renegerated_obj_info->_follow_mode),
159       _size_in_bytes(0), _msotype(renegerated_obj_info->_msotype),
160       _source_addr(src),  _buffered_addr(renegerated_obj_info->_buffered_addr) {}
161 
162     bool should_copy() const { return _follow_mode == make_a_copy; }
163     void set_buffered_addr(address addr)  {
164       assert(should_copy(), "must be");
165       assert(_buffered_addr == nullptr, "cannot be copied twice");
166       assert(addr != nullptr, "must be a valid copy");
167       _buffered_addr = addr;
168     }
169     void set_ptrmap_start(uintx v) { _ptrmap_start = v;    }
170     void set_ptrmap_end(uintx v)   { _ptrmap_end = v;      }
171     uintx ptrmap_start()  const    { return _ptrmap_start; } // inclusive

198     GrowableArray<SourceObjInfo*>* objs() const { return _objs; }
199 
200     void append(SourceObjInfo* src_info);
201     void remember_embedded_pointer(SourceObjInfo* pointing_obj, MetaspaceClosure::Ref* ref);
202     void relocate(int i, ArchiveBuilder* builder);
203 
204     // convenience accessor
205     SourceObjInfo* at(int i) const { return objs()->at(i); }
206   };
207 
208   class CDSMapLogger;
209 
210   static const int INITIAL_TABLE_SIZE = 15889;
211   static const int MAX_TABLE_SIZE     = 1000000;
212 
213   ReservedSpace _shared_rs;
214   VirtualSpace _shared_vs;
215 
216   DumpRegion _rw_region;
217   DumpRegion _ro_region;
218   DumpRegion _cc_region;
219 
220   // Combined bitmap to track pointers in both RW and RO regions. This is updated
221   // as objects are copied into RW and RO.
222   CHeapBitMap _ptrmap;
223 
224   // _ptrmap is split into these two bitmaps which are written into the archive.
225   CHeapBitMap _rw_ptrmap;   // marks pointers in the RW region
226   CHeapBitMap _ro_ptrmap;   // marks pointers in the RO region
227   CHeapBitMap _cc_ptrmap;   // marks pointers in the CC region
228 
229   SourceObjList _rw_src_objs;                 // objs to put in rw region
230   SourceObjList _ro_src_objs;                 // objs to put in ro region
231   ResizeableResourceHashtable<address, SourceObjInfo, AnyObj::C_HEAP, mtClassShared> _src_obj_table;
232   ResizeableResourceHashtable<address, address, AnyObj::C_HEAP, mtClassShared> _buffered_to_src_table;
233   GrowableArray<Klass*>* _klasses;
234   GrowableArray<Symbol*>* _symbols;
235   unsigned int _entropy_seed;
236 
237   // statistics
238   DumpAllocStats _alloc_stats;
239   size_t _total_heap_region_size;
240 
241   void print_region_stats(FileMapInfo *map_info, ArchiveHeapInfo* heap_info);
242   void print_bitmap_region_stats(size_t size, size_t total_size);
243   void print_heap_region_stats(ArchiveHeapInfo* heap_info, size_t total_size);
244 
245   // For global access.
246   static ArchiveBuilder* _current;
247 
248 public:
249   // Use this when you allocate space outside of ArchiveBuilder::dump_{rw,ro}_region.
250   // These are usually for misc tables that are allocated in the RO space.
251   class OtherROAllocMark {
252     char* _oldtop;
253   public:
254     OtherROAllocMark() {
255       _oldtop = _current->_ro_region.top();
256     }
257     ~OtherROAllocMark();
258   };
259 
260 private:
261   FollowMode get_follow_mode(MetaspaceClosure::Ref *ref);
262 
263   void iterate_sorted_roots(MetaspaceClosure* it);
264   void sort_klasses();
265   static int compare_symbols_by_address(Symbol** a, Symbol** b);
266   static int compare_klass_by_name(Klass** a, Klass** b);
267   void update_hidden_class_loader_type(InstanceKlass* ik) NOT_CDS_JAVA_HEAP_RETURN;
268 
269   void make_shallow_copies(DumpRegion *dump_region, const SourceObjList* src_objs);
270   void make_shallow_copy(DumpRegion *dump_region, SourceObjInfo* src_info);
271 
272   void relocate_embedded_pointers(SourceObjList* src_objs);
273 
274   bool is_excluded(Klass* k);
275   void clean_up_src_obj_table();
276 
277 protected:
278   virtual void iterate_roots(MetaspaceClosure* it) = 0;
279 
280   // Conservative estimate for number of bytes needed for:
281   size_t _estimated_metaspaceobj_bytes;   // all archived MetaspaceObj's.
282   size_t _estimated_hashtable_bytes;     // symbol table and dictionaries
283 
284   static const int _total_dump_regions = 2;
285 
286   size_t estimate_archive_size();
287 
288   void start_dump_region(DumpRegion* next);
289   void verify_estimate_size(size_t estimate, const char* which);
290 
291 public:
292   address reserve_buffer();
293 
294   address buffer_bottom()                    const { return _buffer_bottom;                        }
295   address buffer_top()                       const { return (address)current_dump_region()->top(); }
296   address requested_static_archive_bottom()  const { return  _requested_static_archive_bottom;     }
297   address mapped_static_archive_bottom()     const { return  _mapped_static_archive_bottom;        }
298   intx buffer_to_requested_delta()           const { return _buffer_to_requested_delta;            }
299 
300   bool is_in_buffer_space(address p) const {
301     if (current_dump_region() == nullptr) {
302       return false;
303     }
304     return (buffer_bottom() <= p && p < buffer_top());
305   }
306 
307   template <typename T> bool is_in_requested_static_archive(T p) const {
308     return _requested_static_archive_bottom <= (address)p && (address)p < _requested_static_archive_top;
309   }
310 
311   template <typename T> bool is_in_mapped_static_archive(T p) const {
312     return _mapped_static_archive_bottom <= (address)p && (address)p < _mapped_static_archive_top;
313   }
314 
315   template <typename T> bool is_in_buffer_space(T obj) const {
316     return is_in_buffer_space(address(obj));
317   }
318 
319   template <typename T> T to_requested(T obj) const {
320     assert(is_in_buffer_space(obj), "must be");
321     return (T)(address(obj) + _buffer_to_requested_delta);
322   }
323 

336   // The address p points to an object inside the output buffer. When the archive is mapped
337   // at the requested address, what's the offset of this object from _requested_static_archive_bottom?
338   uintx buffer_to_offset(address p) const;
339 
340   // Same as buffer_to_offset, except that the address p points to either (a) an object
341   // inside the output buffer, or (b), an object in the currently mapped static archive.
342   uintx any_to_offset(address p) const;
343 
344   template <typename T>
345   u4 buffer_to_offset_u4(T p) const {
346     uintx offset = buffer_to_offset((address)p);
347     return to_offset_u4(offset);
348   }
349 
350   template <typename T>
351   u4 any_to_offset_u4(T p) const {
352     uintx offset = any_to_offset((address)p);
353     return to_offset_u4(offset);
354   }
355 


356 public:
357   ArchiveBuilder();
358   ~ArchiveBuilder();
359 
360   int entropy();
361   void gather_klasses_and_symbols();
362   void gather_source_objs();
363   bool gather_klass_and_symbol(MetaspaceClosure::Ref* ref, bool read_only);
364   bool gather_one_source_obj(MetaspaceClosure::Ref* ref, bool read_only);
365   void remember_embedded_pointer_in_enclosing_obj(MetaspaceClosure::Ref* ref);
366   static void serialize_dynamic_archivable_items(SerializeClosure* soc);
367 
368   DumpRegion* rw_region() { return &_rw_region; }
369   DumpRegion* ro_region() { return &_ro_region; }
370   DumpRegion* cc_region() { return &_cc_region; }
371 
372   void start_cc_region();
373   void end_cc_region();
374 
375   static char* rw_region_alloc(size_t num_bytes) {
376     return current()->rw_region()->allocate(num_bytes);
377   }
378   static char* ro_region_alloc(size_t num_bytes) {
379     return current()->ro_region()->allocate(num_bytes);
380   }
381   static char* cc_region_alloc(size_t num_bytes) {
382     return current()->cc_region()->allocate(num_bytes);
383   }
384 
385   template <typename T>
386   static Array<T>* new_ro_array(int length) {
387     size_t byte_size = Array<T>::byte_sizeof(length, sizeof(T));
388     Array<T>* array = (Array<T>*)ro_region_alloc(byte_size);
389     array->initialize(length);
390     return array;
391   }
392 
393   template <typename T>
394   static Array<T>* new_rw_array(int length) {
395     size_t byte_size = Array<T>::byte_sizeof(length, sizeof(T));
396     Array<T>* array = (Array<T>*)rw_region_alloc(byte_size);
397     array->initialize(length);
398     return array;
399   }
400 
401   template <typename T>
402   static size_t ro_array_bytesize(int length) {
403     size_t byte_size = Array<T>::byte_sizeof(length, sizeof(T));
404     return align_up(byte_size, SharedSpaceObjectAlignment);
405   }
406 
407   char* ro_strdup(const char* s);
408 
409   static int compare_src_objs(SourceObjInfo** a, SourceObjInfo** b);
410   void sort_metadata_objs();
411   void dump_rw_metadata();
412   void dump_ro_metadata();
413   void relocate_metaspaceobj_embedded_pointers();
414   void record_regenerated_object(address orig_src_obj, address regen_src_obj);
415   void make_klasses_shareable();
416   void make_training_data_shareable();
417   void relocate_to_requested();
418   void write_archive(FileMapInfo* mapinfo, ArchiveHeapInfo* heap_info);
419   void write_region(FileMapInfo* mapinfo, int region_idx, DumpRegion* dump_region,
420                     bool read_only,  bool allow_exec);
421 
422   void write_pointer_in_buffer(address* ptr_location, address src_addr);
423   template <typename T> void write_pointer_in_buffer(T* ptr_location, T src_addr) {
424     write_pointer_in_buffer((address*)ptr_location, (address)src_addr);
425   }
426 
427   void mark_and_relocate_to_buffered_addr(address* ptr_location);
428   template <typename T> void mark_and_relocate_to_buffered_addr(T ptr_location) {
429     mark_and_relocate_to_buffered_addr((address*)ptr_location);
430   }
431 
432   bool has_been_archived(address src_addr) const;
433   address get_buffered_addr(address src_addr) const;
434   template <typename T> T get_buffered_addr(T src_addr) const {
435     return (T)get_buffered_addr((address)src_addr);
436   }
437 
438   address get_source_addr(address buffered_addr) const;
439   template <typename T> T get_source_addr(T buffered_addr) const {
440     return (T)get_source_addr((address)buffered_addr);
441   }
442 
443   // All klasses and symbols that will be copied into the archive
444   GrowableArray<Klass*>*  klasses() const { return _klasses; }
445   GrowableArray<Symbol*>* symbols() const { return _symbols; }
446 
447   static bool is_active() {
448     CDS_ONLY(return (_current != nullptr));
449     NOT_CDS(return false;)
450   }
451 
452   static ArchiveBuilder* current() {

453     assert(_current != nullptr, "ArchiveBuilder must be active");
454     return _current;
455   }
456 
457   static DumpAllocStats* alloc_stats() {
458     return &(current()->_alloc_stats);
459   }
460 
461   static CompactHashtableStats* symbol_stats() {
462     return alloc_stats()->symbol_stats();
463   }
464 
465   static CompactHashtableStats* string_stats() {
466     return alloc_stats()->string_stats();
467   }
468 
469   narrowKlass get_requested_narrow_klass(Klass* k);
470 
471   static Klass* get_buffered_klass(Klass* src_klass) {
472     Klass* klass = (Klass*)current()->get_buffered_addr((address)src_klass);
< prev index next >