diff options
author | Mathieu Chartier <mathieuc@google.com> | 2015-03-27 14:35:38 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2015-04-10 12:57:27 -0700 |
commit | c785344b87221f5e4e6473e5b762e4e61fe65dcf (patch) | |
tree | cd32ad2c2604596a18926f04d4c313dab255ecfd /runtime/gc/accounting | |
parent | a29d93b380c9aeb8270e281aefbdd0c77a430d43 (diff) | |
download | art-c785344b87221f5e4e6473e5b762e4e61fe65dcf.tar.gz art-c785344b87221f5e4e6473e5b762e4e61fe65dcf.tar.bz2 art-c785344b87221f5e4e6473e5b762e4e61fe65dcf.zip |
Move ArtField to native
Add linear alloc. Moved ArtField to be native object. Changed image
writer to put ArtFields after the mirror section.
Savings:
2MB on low ram devices
4MB on normal devices
Total PSS measurements before (normal N5, 95s after shell start):
Image size: 7729152 bytes
23112 kB: .NonMoving
23212 kB: .NonMoving
22868 kB: .NonMoving
23072 kB: .NonMoving
22836 kB: .NonMoving
19618 kB: .Zygote
19850 kB: .Zygote
19623 kB: .Zygote
19924 kB: .Zygote
19612 kB: .Zygote
Avg: 42745.4 kB
After:
Image size: 7462912 bytes
17440 kB: .NonMoving
16776 kB: .NonMoving
16804 kB: .NonMoving
17812 kB: .NonMoving
16820 kB: .NonMoving
18788 kB: .Zygote
18856 kB: .Zygote
19064 kB: .Zygote
18841 kB: .Zygote
18629 kB: .Zygote
3499 kB: .LinearAlloc
3408 kB: .LinearAlloc
3424 kB: .LinearAlloc
3600 kB: .LinearAlloc
3436 kB: .LinearAlloc
Avg: 39439.4 kB
No reflection performance changes.
Bug: 19264997
Bug: 17643507
Change-Id: I10c73a37913332080aeb978c7c94713bdfe4fe1c
Diffstat (limited to 'runtime/gc/accounting')
-rw-r--r-- | runtime/gc/accounting/mod_union_table.cc | 1 | ||||
-rw-r--r-- | runtime/gc/accounting/remembered_set.cc | 1 | ||||
-rw-r--r-- | runtime/gc/accounting/space_bitmap.cc | 34 |
3 files changed, 15 insertions, 21 deletions
diff --git a/runtime/gc/accounting/mod_union_table.cc b/runtime/gc/accounting/mod_union_table.cc index a3fac58e8a..cd3f910d95 100644 --- a/runtime/gc/accounting/mod_union_table.cc +++ b/runtime/gc/accounting/mod_union_table.cc @@ -28,7 +28,6 @@ #include "gc/heap.h" #include "gc/space/space.h" #include "gc/space/image_space.h" -#include "mirror/art_field-inl.h" #include "mirror/object-inl.h" #include "mirror/class-inl.h" #include "mirror/object_array-inl.h" diff --git a/runtime/gc/accounting/remembered_set.cc b/runtime/gc/accounting/remembered_set.cc index b16a146ea9..eeb385e957 100644 --- a/runtime/gc/accounting/remembered_set.cc +++ b/runtime/gc/accounting/remembered_set.cc @@ -26,7 +26,6 @@ #include "gc/collector/semi_space.h" #include "gc/heap.h" #include "gc/space/space.h" -#include "mirror/art_field-inl.h" #include "mirror/object-inl.h" #include "mirror/class-inl.h" #include "mirror/object_array-inl.h" diff --git a/runtime/gc/accounting/space_bitmap.cc b/runtime/gc/accounting/space_bitmap.cc index ad8d9884ec..2da83250d3 100644 --- a/runtime/gc/accounting/space_bitmap.cc +++ b/runtime/gc/accounting/space_bitmap.cc @@ -16,12 +16,12 @@ #include "space_bitmap-inl.h" +#include "art_field-inl.h" #include "base/stringprintf.h" #include "dex_file-inl.h" #include "mem_map.h" #include "mirror/object-inl.h" #include "mirror/class.h" -#include "mirror/art_field.h" #include "mirror/object_array.h" namespace art { @@ -190,15 +190,13 @@ void SpaceBitmap<kAlignment>::WalkInstanceFields(SpaceBitmap<kAlignment>* visite WalkInstanceFields(visited, callback, obj, super, arg); } // Walk instance fields - mirror::ObjectArray<mirror::ArtField>* fields = klass->GetIFields(); - if (fields != NULL) { - for (int32_t i = 0; i < fields->GetLength(); i++) { - mirror::ArtField* field = fields->Get(i); - if (!field->IsPrimitiveType()) { - mirror::Object* value = field->GetObj(obj); - if (value != NULL) { - WalkFieldsInOrder(visited, callback, value, arg); - } + auto* fields = klass->GetIFields(); + for (size_t i = 0, count = klass->NumInstanceFields(); i < count; ++i) { + ArtField* field = &fields[i]; + if (!field->IsPrimitiveType()) { + mirror::Object* value = field->GetObj(obj); + if (value != nullptr) { + WalkFieldsInOrder(visited, callback, value, arg); } } } @@ -219,15 +217,13 @@ void SpaceBitmap<kAlignment>::WalkFieldsInOrder(SpaceBitmap<kAlignment>* visited WalkInstanceFields(visited, callback, obj, klass, arg); // Walk static fields of a Class if (obj->IsClass()) { - mirror::ObjectArray<mirror::ArtField>* fields = klass->GetSFields(); - if (fields != NULL) { - for (int32_t i = 0; i < fields->GetLength(); i++) { - mirror::ArtField* field = fields->Get(i); - if (!field->IsPrimitiveType()) { - mirror::Object* value = field->GetObj(NULL); - if (value != NULL) { - WalkFieldsInOrder(visited, callback, value, arg); - } + auto* sfields = klass->GetSFields(); + for (size_t i = 0, count = klass->NumStaticFields(); i < count; ++i) { + ArtField* field = &sfields[i]; + if (!field->IsPrimitiveType()) { + mirror::Object* value = field->GetObj(nullptr); + if (value != nullptr) { + WalkFieldsInOrder(visited, callback, value, arg); } } } |