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)
diff --git a/runtime/base/allocator.cc b/runtime/base/allocator.cc
index 3469eca..64cdbbf 100644
--- a/runtime/base/allocator.cc
+++ b/runtime/base/allocator.cc
@@ -19,10 +19,16 @@
#include <inttypes.h>
#include <stdlib.h>
+#include "atomic.h"
#include "base/logging.h"
+#include "thread-inl.h"
namespace art {
+Atomic<uint64_t> TrackedAllocators::bytes_used_[kAllocatorTagCount];
+Atomic<uint64_t> TrackedAllocators::max_bytes_used_[kAllocatorTagCount];
+Atomic<uint64_t> TrackedAllocators::total_bytes_used_[kAllocatorTagCount];
+
class MallocAllocator FINAL : public Allocator {
public:
explicit MallocAllocator() {}
@@ -70,5 +76,19 @@
return &g_noop_allocator;
}
+void TrackedAllocators::Dump(std::ostream& os) {
+ if (kEnableTrackingAllocator) {
+ os << "Dumping native memory usage\n";
+ for (size_t i = 0; i < kAllocatorTagCount; ++i) {
+ uint64_t bytes_used = bytes_used_[i].LoadRelaxed();
+ uint64_t max_bytes_used = max_bytes_used_[i].LoadRelaxed();
+ uint64_t total_bytes_used = total_bytes_used_[i].LoadRelaxed();
+ if (total_bytes_used != 0) {
+ os << static_cast<AllocatorTag>(i) << " active=" << bytes_used << " max="
+ << max_bytes_used << " total=" << total_bytes_used << "\n";
+ }
+ }
+ }
+}
} // namespace art