From 059ef3ddb2088f926ac452889e0953fdcd646a5e Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Tue, 18 Aug 2015 13:54:21 -0700 Subject: Always visit object class from VisitReferences We don't want to unload classes which have instances. Slight increase in CMS GC time from ~6.5s to ~7.3s on EvaluateAndApplyChanges. Bug: 22720414 Change-Id: I467ff9c9d55163d2a90b999aef3bdd7b3f648bac --- runtime/mirror/object-inl.h | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) (limited to 'runtime/mirror/object-inl.h') diff --git a/runtime/mirror/object-inl.h b/runtime/mirror/object-inl.h index 7b1660ba7e..586ae30d19 100644 --- a/runtime/mirror/object-inl.h +++ b/runtime/mirror/object-inl.h @@ -942,13 +942,10 @@ inline bool Object::CasFieldStrongSequentiallyConsistentObjectWithoutWriteBarrie return success; } -template +template inline void Object::VisitFieldsReferences(uint32_t ref_offsets, const Visitor& visitor) { if (!kIsStatic && (ref_offsets != mirror::Class::kClassWalkSuper)) { // Instance fields and not the slow-path. - if (kVisitClass) { - visitor(this, ClassOffset(), kIsStatic); - } uint32_t field_offset = mirror::kObjectHeaderSize; while (ref_offsets != 0) { if ((ref_offsets & 1) != 0) { @@ -974,9 +971,9 @@ inline void Object::VisitFieldsReferences(uint32_t ref_offsets, const Visitor& v ? klass->GetFirstReferenceStaticFieldOffset( Runtime::Current()->GetClassLinker()->GetImagePointerSize()) : klass->GetFirstReferenceInstanceFieldOffset(); - for (size_t i = 0; i < num_reference_fields; ++i) { + for (size_t i = 0u; i < num_reference_fields; ++i) { // TODO: Do a simpler check? - if (kVisitClass || field_offset.Uint32Value() != ClassOffset().Uint32Value()) { + if (field_offset.Uint32Value() != ClassOffset().Uint32Value()) { visitor(this, field_offset, kIsStatic); } field_offset = MemberOffset(field_offset.Uint32Value() + @@ -986,19 +983,17 @@ inline void Object::VisitFieldsReferences(uint32_t ref_offsets, const Visitor& v } } -template +template inline void Object::VisitInstanceFieldsReferences(mirror::Class* klass, const Visitor& visitor) { - VisitFieldsReferences( - klass->GetReferenceInstanceOffsets(), visitor); + VisitFieldsReferences(klass->GetReferenceInstanceOffsets(), visitor); } -template +template inline void Object::VisitStaticFieldsReferences(mirror::Class* klass, const Visitor& visitor) { DCHECK(!klass->IsTemp()); - klass->VisitFieldsReferences(0, visitor); + klass->VisitFieldsReferences(0, visitor); } - template inline bool Object::IsClassLoader() { return GetClass()->IsClassLoaderClass(); @@ -1010,25 +1005,23 @@ inline mirror::ClassLoader* Object::AsClassLoader() { return down_cast(this); } -template +template inline void Object::VisitReferences(const Visitor& visitor, const JavaLangRefVisitor& ref_visitor) { mirror::Class* klass = GetClass(); + visitor(this, ClassOffset(), false); if (klass == Class::GetJavaLangClass()) { - AsClass()->VisitReferences(klass, visitor); + AsClass()->VisitReferences(klass, visitor); } else if (klass->IsArrayClass() || klass->IsStringClass()) { if (klass->IsObjectArrayClass()) { - AsObjectArray()->VisitReferences(visitor); - } else if (kVisitClass) { - visitor(this, ClassOffset(), false); + AsObjectArray()->VisitReferences(visitor); } } else if (klass->IsClassLoaderClass()) { mirror::ClassLoader* class_loader = AsClassLoader(); - class_loader->VisitReferences(klass, visitor); + class_loader->VisitReferences(klass, visitor); } else { DCHECK(!klass->IsVariableSize()); - VisitInstanceFieldsReferences(klass, visitor); + VisitInstanceFieldsReferences(klass, visitor); if (UNLIKELY(klass->IsTypeOfReferenceClass())) { ref_visitor(klass, AsReference()); } -- cgit v1.2.3