654dd48e2230e16bfaa225decce72b52642e2f78 |
|
09-Jul-2014 |
Hiroshi Yamauchi <yamauchi@google.com> |
Improve the OOME fragmentation message. Change-Id: I390d3622f8d572ec7e34ea6dff9e1e0936e81ac1
|
31f441464c0c8f840aba37e236ad133f30308d70 |
|
08-Apr-2014 |
Mathieu Chartier <mathieuc@google.com> |
Clean-up heap spaces. We now use the CMS collector instead of the semispace collector when the phone is booting. We still perform compaction during the zygote space creation. This reduces time spent in GC by ~2s during boot and doesn't affect zygote space size. Changed the space creation logic to create the temp space when a background transition occurs. Added a flag to each space which is true if you are allowed to move objects that are within this space. Removed SwapSemiSpaces call from the semi space collector, it is now the job of the caller to do this with threads suspended. This simplifies the logic in the zygote compaction / heap transition code since these do not copy from one semispace to another. Added Space::Clear to RosAllocSpace and DlMallocSpace. This greatly simplifies the code used for collector transitions. Time spent in GC creating zygote space: Before: 3.4s, After: 1.28s No change in zygote space size. Bug: 13878055 Change-Id: I700348ab7d5bf3aa537c0cd70c0fed09aa4b0623
|
26d69ffc0ebc98fbc5f316d8cd3ee6ba5b2001ac |
|
27-Feb-2014 |
Hiroshi Yamauchi <yamauchi@google.com> |
Decrease lock uses in RosAlloc::BulkFree(). Read rosalloc page map entries without a lock. Disabled for now. This change speeds up Ritz MemAllocTest by ~25% on host and reduces the GC sweep time, but somehow slows it down by ~5% on N4, which is why it's disabled for now. TODO: look into the slowdown on N4 more. Bug: 8262791 Bug: 11790317 Change-Id: I936bbee9cfbd389e70d6343503bf0923865d2a2c
|
15d3402bbf8265eb1165694da2e4117eb128f3bc |
|
27-Feb-2014 |
Mathieu Chartier <mathieuc@google.com> |
Add custom SIGSEGV handler to help find heap corruption. The new signal handler prints heap diagnostics when you get a SIGSEGV. Added a fault message member in runtime which is modifiable by Runtime::SetFaultMessage. When you get a SIGSEGV it will print out whatever is stored in this string as well as the normal information. This is useful for debugging heap corruption since it lets you see which threads were in which methods when the last GC occured. Added some smarter object dumping logic when the faulting address is in the heap. Bug: 12934910 Change-Id: Ia72be2c39f70ad711cbd746d66fad2b617d5d29f
|
6fac447555dc94a935b78198479cce645c837b89 |
|
26-Feb-2014 |
Ian Rogers <irogers@google.com> |
Make allocations report usable size. Work-in-progress to allow arrays to fill usable size. Bug: 13028925. Use C++11's override keyword on GCC >= 2.7 to ensure that we override GC and allocator methods. Move initial mirror::Class set up into a Functor so that all allocated objects have non-zero sizes. Use this property to assert that all objects are never larger than their usable size. Other bits of GC related clean-up, missing initialization, missing use of const, hot methods in .cc files, "unimplemented" functions that fail at runtime in header files, reducing header file includes, move valgrind's space into its own files, reduce number of array allocation routines. Change-Id: Id5760041a2d7f94dcaf17ec760f6095ec75dadaa
|
ef7d42fca18c16fbaf103822ad16f23246e2905d |
|
06-Jan-2014 |
Ian Rogers <irogers@google.com> |
Object model changes to support 64bit. Modify mirror objects so that references between them use an ObjectReference value type rather than an Object* so that functionality to compress larger references can be captured in the ObjectRefererence implementation. ObjectReferences are 32bit and all other aspects of object layout remain as they are currently. Expand fields in objects holding pointers so they can hold 64bit pointers. Its expected the size of these will come down by improving where we hold compiler meta-data. Stub out x86_64 architecture specific runtime implementation. Modify OutputStream so that reads and writes are of unsigned quantities. Make the use of portable or quick code more explicit. Templatize AtomicInteger to support more than just int32_t as a type. Add missing, and fix issues relating to, missing annotalysis information on the mutator lock. Refactor and share implementations for array copy between System and uses elsewhere in the runtime. Fix numerous 64bit build issues. Change-Id: I1a5694c251a42c9eff71084dfdd4b51fff716822
|
a1602f28c0e3127ad511712d4b08db89737ae901 |
|
14-Jan-2014 |
Mathieu Chartier <mathieuc@google.com> |
Add zygote space as its own space type. Helps prevent errors caused from doing invalid operations on the old alloc space. Removed some duplicated code in mark_sweep.cc and semi_space.cc. Change-Id: I67a772cab30d698744c918aad581053f282a4a99
|
e6da9af8dfe0a3e3fbc2be700554f6478380e7b9 |
|
16-Dec-2013 |
Mathieu Chartier <mathieuc@google.com> |
Background compaction support. When the process state changes to a state which does not perceives jank, we copy from the main free-list backed allocation space to the bump pointer space and enable the semispace allocator. When we transition back to foreground, we copy back to a free-list backed space. Create a seperate non-moving space which only holds non-movable objects. This enables us to quickly wipe the current alloc space (DlMalloc / RosAlloc) when we transition to background. Added multiple alloc space support to the sticky mark sweep GC. Added a -XX:BackgroundGC option which lets you specify which GC to use for background apps. Passing in -XX:BackgroundGC=SS makes the heap compact the heap for apps which do not perceive jank. Results: Simple background foreground test: 0. Reboot phone, unlock. 1. Open browser, click on home. 2. Open calculator, click on home. 3. Open calendar, click on home. 4. Open camera, click on home. 5. Open clock, click on home. 6. adb shell dumpsys meminfo PSS Normal ART: Sample 1: 88468 kB: Dalvik 3188 kB: Dalvik Other Sample 2: 81125 kB: Dalvik 3080 kB: Dalvik Other PSS Dalvik: Total PSS by category: Sample 1: 81033 kB: Dalvik 27787 kB: Dalvik Other Sample 2: 81901 kB: Dalvik 28869 kB: Dalvik Other PSS ART + Background Compaction: Sample 1: 71014 kB: Dalvik 1412 kB: Dalvik Other Sample 2: 73859 kB: Dalvik 1400 kB: Dalvik Other Dalvik other reduction can be explained by less deep allocation stacks / less live bitmaps / less dirty cards. TODO improvements: Recycle mem-maps which are unused in the current state. Not hardcode 64 MB capacity of non movable space (avoid returning linear alloc nightmares). Figure out ways to deal with low virtual address memory problems. Bug: 8981901 Change-Id: Ib235d03f45548ffc08a06b8ae57bf5bada49d6f3
|
e48780b8278240dec2d3164512f7d3317a5495c1 |
|
18-Dec-2013 |
Hiroshi Yamauchi <yamauchi@google.com> |
Remove some unnecessary code from dlmalloc_space/rosalloc_space. Removed GetTotalBytesAllocated(), GetTotalObjectsAllocated(), and InternalAllocationSize(). No performance improvement observed. Change-Id: Ie20433a0fd328fc7f61d4afd54d18fbdc4aa4a17
|
573f7d2d68e1838a0485e6b40d90c967526e00c2 |
|
17-Dec-2013 |
Hiroshi Yamauchi <yamauchi@google.com> |
Fix an array copy benchmark regression. Add different page release modes to rosalloc. Bug: 12064551 Change-Id: Ib837bbd1a2757741a4e2743e0a1272bf46a30252
|
4ce1f00cc74867188347e463f4a5ecb9fe55cde5 |
|
18-Nov-2013 |
Hiroshi Yamauchi <yamauchi@google.com> |
Fix a per-process dumpsys meminfo crash. In the InvalidateAllocator() function, DlMallocSpace and RosAllocSpace both null out the underlying allocator pointer at the zygote fork time so that new allocations won't accidentally happen in the zygote space after a zygote fork. However, nulling out the only allocator pointer would cause crashes in non-allocation uses such as GetFootprint() in this particular crash. Fix this by creating a second pointer just for the allocation purpose that gets nulled upon a InvalidateAllocator() call while the original pointer keeps pointing to the allocator. Change-Id: Ie751d9380db39baace9e25712a3824eec9a9969a
|
e5eedcb4a634246d1f912992853441f715d705cc |
|
18-Nov-2013 |
Hiroshi Yamauchi <yamauchi@google.com> |
Fix cpplint errors. Change-Id: I21f7423ebe69a77d456b0d318de73448489d2df4
|
cf58d4adf461eb9b8e84baa8019054c88cd8acc6 |
|
26-Sep-2013 |
Hiroshi Yamauchi <yamauchi@google.com> |
A custom 'runs-of-slots' memory allocator. Bug: 9986565 Change-Id: I0eb73b9458752113f519483616536d219d5f798b
|
590fee9e8972f872301c2d16a575d579ee564bee |
|
13-Sep-2013 |
Mathieu Chartier <mathieuc@google.com> |
Compacting collector. The compacting collector is currently similar to semispace. It works by copying objects back and forth between two bump pointer spaces. There are types of objects which are "non-movable" due to current runtime limitations. These are Classes, Methods, and Fields. Bump pointer spaces are a new type of continuous alloc space which have no lock in the allocation code path. When you allocate from these it uses atomic operations to increase an index. Traversing the objects in the bump pointer space relies on Object::SizeOf matching the allocated size exactly. Runtime changes: JNI::GetArrayElements returns copies objects if you attempt to get the backing data of a movable array. For GetArrayElementsCritical, we return direct backing storage for any types of arrays, but temporarily disable the GC until the critical region is completed. Added a new runtime call called VisitObjects, this is used in place of the old pattern which was flushing the allocation stack and walking the bitmaps. Changed image writer to be compaction safe and use object monitor word for forwarding addresses. Added a bunch of added SIRTs to ClassLinker, MethodLinker, etc.. TODO: Enable switching allocators, compacting on background, etc.. Bug: 8981901 Change-Id: I3c886fd322a6eef2b99388d19a765042ec26ab99
|
be031fff278799984166ec866c2dd202447e0f23 |
|
09-Oct-2013 |
Hiroshi Yamauchi <yamauchi@google.com> |
Remove four counter increments out of the allocation path. - This change removes the four allocation counters (the number of bytes allocated, the number of objects allocated, the number of bytes allocated ever, the number of objects allocated ever) from the dlmalloc space allocation path. Now those counter values are computed on the fly based on a combination of the two new counters that are incremented by the GC side (the number of bytes freed ever and the number of objects freed ever) and mspace_inspect_all() calls. - This results in a 1-2% speedup (though with some noise) in Ritz MemAllocTest on Nexus 4. Bug: 9986565 Change-Id: Id9a8e05a745ac1e5ea7a2b5fd9319814a9d4af13
|
0f72e4136aecaf6976fdb55916bbd7b6d5c9c77b |
|
07-Sep-2013 |
Mathieu Chartier <mathieuc@google.com> |
Improve heap verification. Re-enabled checking the allocation stack for heap verification. Added tracking of recent frees in DlMallocSpace if debug spaces is enabled. This is useful when you have heap corruption caused by a live object referencing a recently freed object. Added various other sanity checks in the GC. Bug: 10626133 Change-Id: I5ada11966336ae9a06615b16f4b933f05b5d0c32
|
eb5710eba75bf338da56386ca29039df9d5134cb |
|
26-Jul-2013 |
Mathieu Chartier <mathieuc@google.com> |
New free list large object space. More memory efficient, uses a std::set instead of multiset. Each large object allocation has sizeof(size_t) * 2 bytes of overhead without taking into account the std::set overhead. If debug is enabled, then objects are mprotected as they are freed. Added a large object test to space test. Change-Id: I3e714e1afbed49208a4a7e60f9ef7d701a56801b
|
50b2928501fe489c108472e7648ec98cdca62e10 |
|
30-Jul-2013 |
Hiroshi Yamauchi <yamauchi@google.com> |
Improve the allocation speed. - Improves the Ritz MemAllocTest benchmark result by ~500 ms (or ~5%) on Nexus 4. - Move the memset() call that zeroes the allocated memory out of the lock region. - De-virtualize/Inline the allocation call chains into Heap::AllocObject(). - Turn Heap::measure_allocation_time_ into a static const variable. - Surround the VerifyObject() call with kIsDebugBuild. Bug: 9986565 Change-Id: Ib70b6d051a80ec329788b30256565561f031da2a
|
834b394ee759ed31c5371d8093d7cd8cd90014a8 |
|
31-Jul-2013 |
Brian Carlstrom <bdc@google.com> |
Merge remote-tracking branch 'goog/dalvik-dev' into merge-art-to-dalvik-dev Change-Id: I323e9e8c29c3e39d50d9aba93121b26266c52a46
|
09b07a96094086e205948717666025909a75163b |
|
15-Jul-2013 |
Hiroshi Yamauchi <yamauchi@google.com> |
Show size/alloc/free per Dalvik heap space in dumpsys Add the heap size/alloc/free stats to the Dalvik heap space breakdown section in dumpsys meminfo. Also, now the zygote heap has a distict ashmem region name. Bug: 9532137 Bug: 8266259 Change-Id: Ieeb02f5f5ebf7ffe35d4b55ad81d46989af2827b
|
fc0e3219edc9a5bf81b166e82fd5db2796eb6a0d |
|
17-Jul-2013 |
Brian Carlstrom <bdc@google.com> |
Fix multiple inclusion guards to match new pathnames Change-Id: Id7735be1d75bc315733b1773fba45c1deb8ace43
|
7940e44f4517de5e2634a7e07d58d0fb26160513 |
|
12-Jul-2013 |
Brian Carlstrom <bdc@google.com> |
Create separate Android.mk for main build targets The runtime, compiler, dex2oat, and oatdump now are in seperate trees to prevent dependency creep. They can now be individually built without rebuilding the rest of the art projects. dalvikvm and jdwpspy were already this way. Builds in the art directory should behave as before, building everything including tests. Change-Id: Ic6b1151e5ed0f823c3dd301afd2b13eb2d8feb81
|