summaryrefslogtreecommitdiffstats
path: root/runtime/mem_map.h
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2014-08-25 13:08:22 -0700
committerMathieu Chartier <mathieuc@google.com>2014-08-29 18:57:35 -0700
commitbad0267eaab9d6a522d05469ff90501deefdb88b (patch)
tree1ce689b75184cb322b9edde34d7af938c658a6ae /runtime/mem_map.h
parent0772a9d99c8774463c9076824340eaa4eb66f47f (diff)
downloadandroid_art-bad0267eaab9d6a522d05469ff90501deefdb88b.tar.gz
android_art-bad0267eaab9d6a522d05469ff90501deefdb88b.tar.bz2
android_art-bad0267eaab9d6a522d05469ff90501deefdb88b.zip
Add native memory accounting through custom allocator.
Added a custom allocator that lets you pass in a special tag which specifices where the allocation came from. This is used when dumping. The performance overhead is low since each allocation only does a atomic add/sub for each allocation/free. The measurements are dumped to traces.txt during SIGQUIT. Example output: I/art (27274): AllocatorTagHeap active=120 max=120 total=168 I/art (27274): AllocatorTagMonitorList active=1572 max=6240 total=11724 I/art (27274): AllocatorTagClassTable active=185208 max=185208 total=268608 I/art (27274): AllocatorTagInternTable active=430368 max=430368 total=436080 I/art (27274): AllocatorTagMaps active=5616 max=6168 total=34392 I/art (27274): AllocatorTagLOS active=1024 max=1536 total=2044 I/art (27274): AllocatorTagSafeMap active=0 max=51936 total=533688 I/art (27274): AllocatorTagLOSMaps active=144 max=1248 total=5760 I/art (27274): AllocatorTagReferenceTable active=10944 max=11840 total=19136 I/art (27274): AllocatorTagHeapBitmap active=32 max=40 total=56 I/art (27274): AllocatorTagHeapBitmapLOS active=8 max=8 total=8 I/art (27274): AllocatorTagVerifier active=0 max=18844 total=1073156 I/art (27274): AllocatorTagModUnionCardSet active=5300 max=5920 total=56020 I/art (27274): AllocatorTagModUnionReferenceArray active=24864 max=24864 total=24864 I/art (27274): AllocatorTagJNILibrarires active=320 max=320 total=320 I/art (27274): AllocatorTagOatFile active=1400 max=1400 total=5852 Change-Id: Ibb470ef2e9c9a24563bb46422d46a55799704d82 (cherry picked from commit 5369c40f75fdcb1be7a7c06db212ce965c83a164)
Diffstat (limited to 'runtime/mem_map.h')
-rw-r--r--runtime/mem_map.h9
1 files changed, 5 insertions, 4 deletions
diff --git a/runtime/mem_map.h b/runtime/mem_map.h
index 9bfcd96d7f..e49ed48d69 100644
--- a/runtime/mem_map.h
+++ b/runtime/mem_map.h
@@ -26,6 +26,7 @@
#include <sys/mman.h> // For the PROT_* and MAP_* constants.
#include <sys/types.h>
+#include "base/allocator.h"
#include "globals.h"
namespace art {
@@ -135,13 +136,13 @@ class MemMap {
static void DumpMaps(std::ostream& os)
LOCKS_EXCLUDED(Locks::mem_maps_lock_);
+ typedef AllocationTrackingMultiMap<void*, MemMap*, kAllocatorTagMaps> Maps;
+
private:
MemMap(const std::string& name, byte* begin, size_t size, void* base_begin, size_t base_size,
int prot, bool reuse) LOCKS_EXCLUDED(Locks::mem_maps_lock_);
- static void DumpMaps(std::ostream& os, const std::multimap<void*, MemMap*>& mem_maps)
- LOCKS_EXCLUDED(Locks::mem_maps_lock_);
- static void DumpMapsLocked(std::ostream& os, const std::multimap<void*, MemMap*>& mem_maps)
+ static void DumpMapsLocked(std::ostream& os)
EXCLUSIVE_LOCKS_REQUIRED(Locks::mem_maps_lock_);
static bool HasMemMap(MemMap* map)
EXCLUSIVE_LOCKS_REQUIRED(Locks::mem_maps_lock_);
@@ -166,7 +167,7 @@ class MemMap {
#endif
// All the non-empty MemMaps. Use a multimap as we do a reserve-and-divide (eg ElfMap::Load()).
- static std::multimap<void*, MemMap*> maps_ GUARDED_BY(Locks::mem_maps_lock_);
+ static Maps maps_ GUARDED_BY(Locks::mem_maps_lock_);
friend class MemMapTest; // To allow access to base_begin_ and base_size_.
};