< prev index next >

src/hotspot/share/memory/heapShared.cpp

Print this page




 566           _level + 1, _subgraph_info, obj, _is_closed_archive, THREAD);
 567       assert(archived != NULL, "VM should have exited with unarchivable objects for _level > 1");
 568       assert(HeapShared::is_archived_object(archived), "must be");
 569 
 570       if (!_record_klasses_only) {
 571         // Update the reference in the archived copy of the referencing object.
 572         log_debug(cds, heap)("(%d) updating oop @[" PTR_FORMAT "] " PTR_FORMAT " ==> " PTR_FORMAT,
 573                              _level, p2i(new_p), p2i(obj), p2i(archived));
 574         RawAccess<IS_NOT_NULL>::oop_store(new_p, archived);
 575       }
 576     }
 577   }
 578 };
 579 
 580 void HeapShared::check_closed_archive_heap_region_object(InstanceKlass* k,
 581                                                          Thread* THREAD) {
 582   // Check fields in the object
 583   for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
 584     if (!fs.access_flags().is_static()) {
 585       BasicType ft = fs.field_descriptor().field_type();
 586       if (!fs.access_flags().is_final() && (ft == T_ARRAY || ft == T_OBJECT)) {
 587         ResourceMark rm(THREAD);
 588         log_warning(cds, heap)(
 589           "Please check reference field in %s instance in closed archive heap region: %s %s",
 590           k->external_name(), (fs.name())->as_C_string(),
 591           (fs.signature())->as_C_string());
 592       }
 593     }
 594   }
 595 }
 596 
 597 // (1) If orig_obj has not been archived yet, archive it.
 598 // (2) If orig_obj has not been seen yet (since start_recording_subgraph() was called),
 599 //     trace all  objects that are reachable from it, and make sure these objects are archived.
 600 // (3) Record the klasses of all orig_obj and all reachable objects.
 601 oop HeapShared::archive_reachable_objects_from(int level,
 602                                                KlassSubGraphInfo* subgraph_info,
 603                                                oop orig_obj,
 604                                                bool is_closed_archive,
 605                                                TRAPS) {
 606   assert(orig_obj != NULL, "must be");


 854   delete_seen_objects_table();
 855 
 856   _num_total_subgraph_recordings ++;
 857   _num_total_walked_objs      += _num_new_walked_objs;
 858   _num_total_archived_objs    += _num_new_archived_objs;
 859   _num_total_recorded_klasses +=  num_new_recorded_klasses;
 860 }
 861 
 862 class ArchivableStaticFieldFinder: public FieldClosure {
 863   InstanceKlass* _ik;
 864   Symbol* _field_name;
 865   bool _found;
 866   int _offset;
 867 public:
 868   ArchivableStaticFieldFinder(InstanceKlass* ik, Symbol* field_name) :
 869     _ik(ik), _field_name(field_name), _found(false), _offset(-1) {}
 870 
 871   virtual void do_field(fieldDescriptor* fd) {
 872     if (fd->name() == _field_name) {
 873       assert(!_found, "fields cannot be overloaded");
 874       assert(fd->field_type() == T_OBJECT || fd->field_type() == T_ARRAY, "can archive only obj or array fields");
 875       _found = true;
 876       _offset = fd->offset();
 877     }
 878   }
 879   bool found()     { return _found;  }
 880   int offset()     { return _offset; }
 881 };
 882 
 883 void HeapShared::init_subgraph_entry_fields(ArchivableStaticFieldInfo fields[],
 884                                             int num, Thread* THREAD) {
 885   for (int i = 0; i < num; i++) {
 886     ArchivableStaticFieldInfo* info = &fields[i];
 887     TempNewSymbol klass_name =  SymbolTable::new_symbol(info->klass_name);
 888     TempNewSymbol field_name =  SymbolTable::new_symbol(info->field_name);
 889 
 890     Klass* k = SystemDictionary::resolve_or_null(klass_name, THREAD);
 891     assert(k != NULL && !HAS_PENDING_EXCEPTION, "class must exist");
 892     InstanceKlass* ik = InstanceKlass::cast(k);
 893     assert(InstanceKlass::cast(ik)->is_shared_boot_class(),
 894            "Only support boot classes");




 566           _level + 1, _subgraph_info, obj, _is_closed_archive, THREAD);
 567       assert(archived != NULL, "VM should have exited with unarchivable objects for _level > 1");
 568       assert(HeapShared::is_archived_object(archived), "must be");
 569 
 570       if (!_record_klasses_only) {
 571         // Update the reference in the archived copy of the referencing object.
 572         log_debug(cds, heap)("(%d) updating oop @[" PTR_FORMAT "] " PTR_FORMAT " ==> " PTR_FORMAT,
 573                              _level, p2i(new_p), p2i(obj), p2i(archived));
 574         RawAccess<IS_NOT_NULL>::oop_store(new_p, archived);
 575       }
 576     }
 577   }
 578 };
 579 
 580 void HeapShared::check_closed_archive_heap_region_object(InstanceKlass* k,
 581                                                          Thread* THREAD) {
 582   // Check fields in the object
 583   for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
 584     if (!fs.access_flags().is_static()) {
 585       BasicType ft = fs.field_descriptor().field_type();
 586       if (!fs.access_flags().is_final() && is_reference_type(ft)) {
 587         ResourceMark rm(THREAD);
 588         log_warning(cds, heap)(
 589           "Please check reference field in %s instance in closed archive heap region: %s %s",
 590           k->external_name(), (fs.name())->as_C_string(),
 591           (fs.signature())->as_C_string());
 592       }
 593     }
 594   }
 595 }
 596 
 597 // (1) If orig_obj has not been archived yet, archive it.
 598 // (2) If orig_obj has not been seen yet (since start_recording_subgraph() was called),
 599 //     trace all  objects that are reachable from it, and make sure these objects are archived.
 600 // (3) Record the klasses of all orig_obj and all reachable objects.
 601 oop HeapShared::archive_reachable_objects_from(int level,
 602                                                KlassSubGraphInfo* subgraph_info,
 603                                                oop orig_obj,
 604                                                bool is_closed_archive,
 605                                                TRAPS) {
 606   assert(orig_obj != NULL, "must be");


 854   delete_seen_objects_table();
 855 
 856   _num_total_subgraph_recordings ++;
 857   _num_total_walked_objs      += _num_new_walked_objs;
 858   _num_total_archived_objs    += _num_new_archived_objs;
 859   _num_total_recorded_klasses +=  num_new_recorded_klasses;
 860 }
 861 
 862 class ArchivableStaticFieldFinder: public FieldClosure {
 863   InstanceKlass* _ik;
 864   Symbol* _field_name;
 865   bool _found;
 866   int _offset;
 867 public:
 868   ArchivableStaticFieldFinder(InstanceKlass* ik, Symbol* field_name) :
 869     _ik(ik), _field_name(field_name), _found(false), _offset(-1) {}
 870 
 871   virtual void do_field(fieldDescriptor* fd) {
 872     if (fd->name() == _field_name) {
 873       assert(!_found, "fields cannot be overloaded");
 874       assert(is_reference_type(fd->field_type()), "can archive only obj or array fields");
 875       _found = true;
 876       _offset = fd->offset();
 877     }
 878   }
 879   bool found()     { return _found;  }
 880   int offset()     { return _offset; }
 881 };
 882 
 883 void HeapShared::init_subgraph_entry_fields(ArchivableStaticFieldInfo fields[],
 884                                             int num, Thread* THREAD) {
 885   for (int i = 0; i < num; i++) {
 886     ArchivableStaticFieldInfo* info = &fields[i];
 887     TempNewSymbol klass_name =  SymbolTable::new_symbol(info->klass_name);
 888     TempNewSymbol field_name =  SymbolTable::new_symbol(info->field_name);
 889 
 890     Klass* k = SystemDictionary::resolve_or_null(klass_name, THREAD);
 891     assert(k != NULL && !HAS_PENDING_EXCEPTION, "class must exist");
 892     InstanceKlass* ik = InstanceKlass::cast(k);
 893     assert(InstanceKlass::cast(ik)->is_shared_boot_class(),
 894            "Only support boot classes");


< prev index next >