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");
|