| Index: src/isolate.cc
|
| diff --git a/src/isolate.cc b/src/isolate.cc
|
| index c3e5eb6b3771c8a32ddbbccd465c44e22d94e2b6..ee3257cd274862dca0e9b6dbd6a49e4b9b7b23f4 100644
|
| --- a/src/isolate.cc
|
| +++ b/src/isolate.cc
|
| @@ -1930,16 +1930,26 @@ void Isolate::ThreadDataTable::RemoveAllThreads(Isolate* isolate) {
|
|
|
| class VerboseAccountingAllocator : public AccountingAllocator {
|
| public:
|
| - VerboseAccountingAllocator(Heap* heap, size_t sample_bytes)
|
| - : heap_(heap), last_memory_usage_(0), sample_bytes_(sample_bytes) {}
|
| + VerboseAccountingAllocator(Heap* heap, size_t allocation_sample_bytes,
|
| + size_t pool_sample_bytes)
|
| + : heap_(heap),
|
| + last_memory_usage_(0),
|
| + last_pool_size_(0),
|
| + allocation_sample_bytes_(allocation_sample_bytes),
|
| + pool_sample_bytes_(pool_sample_bytes) {}
|
|
|
| v8::internal::Segment* GetSegment(size_t size) override {
|
| v8::internal::Segment* memory = AccountingAllocator::GetSegment(size);
|
| if (memory) {
|
| - size_t current = GetCurrentMemoryUsage();
|
| - if (last_memory_usage_.Value() + sample_bytes_ < current) {
|
| - PrintJSON(current);
|
| - last_memory_usage_.SetValue(current);
|
| + size_t malloced_current = GetCurrentMemoryUsage();
|
| + size_t pooled_current = GetCurrentPoolSize();
|
| +
|
| + if (last_memory_usage_.Value() + allocation_sample_bytes_ <
|
| + malloced_current ||
|
| + last_pool_size_.Value() + pool_sample_bytes_ < pooled_current) {
|
| + PrintJSON(malloced_current, pooled_current);
|
| + last_memory_usage_.SetValue(malloced_current);
|
| + last_pool_size_.SetValue(pooled_current);
|
| }
|
| }
|
| return memory;
|
| @@ -1947,31 +1957,38 @@ class VerboseAccountingAllocator : public AccountingAllocator {
|
|
|
| void ReturnSegment(v8::internal::Segment* memory) override {
|
| AccountingAllocator::ReturnSegment(memory);
|
| - size_t current = GetCurrentMemoryUsage();
|
| - if (current + sample_bytes_ < last_memory_usage_.Value()) {
|
| - PrintJSON(current);
|
| - last_memory_usage_.SetValue(current);
|
| + size_t malloced_current = GetCurrentMemoryUsage();
|
| + size_t pooled_current = GetCurrentPoolSize();
|
| +
|
| + if (malloced_current + allocation_sample_bytes_ <
|
| + last_memory_usage_.Value() ||
|
| + pooled_current + pool_sample_bytes_ < last_pool_size_.Value()) {
|
| + PrintJSON(malloced_current, pooled_current);
|
| + last_memory_usage_.SetValue(malloced_current);
|
| + last_pool_size_.SetValue(pooled_current);
|
| }
|
| }
|
|
|
| private:
|
| - void PrintJSON(size_t sample) {
|
| + void PrintJSON(size_t malloced, size_t pooled) {
|
| // Note: Neither isolate, nor heap is locked, so be careful with accesses
|
| // as the allocator is potentially used on a concurrent thread.
|
| double time = heap_->isolate()->time_millis_since_init();
|
| PrintF(
|
| "{"
|
| - "\"type\": \"malloced\", "
|
| + "\"type\": \"zone\", "
|
| "\"isolate\": \"%p\", "
|
| "\"time\": %f, "
|
| - "\"value\": %zu"
|
| + "\"allocated\": %zu,"
|
| + "\"pooled\": %zu"
|
| "}\n",
|
| - reinterpret_cast<void*>(heap_->isolate()), time, sample);
|
| + reinterpret_cast<void*>(heap_->isolate()), time, malloced, pooled);
|
| }
|
|
|
| Heap* heap_;
|
| base::AtomicNumber<size_t> last_memory_usage_;
|
| - size_t sample_bytes_;
|
| + base::AtomicNumber<size_t> last_pool_size_;
|
| + size_t allocation_sample_bytes_, pool_sample_bytes_;
|
| };
|
|
|
| Isolate::Isolate(bool enable_serializer)
|
| @@ -1999,9 +2016,9 @@ Isolate::Isolate(bool enable_serializer)
|
| descriptor_lookup_cache_(NULL),
|
| handle_scope_implementer_(NULL),
|
| unicode_cache_(NULL),
|
| - allocator_(FLAG_trace_gc_object_stats
|
| - ? new VerboseAccountingAllocator(&heap_, 256 * KB)
|
| - : new AccountingAllocator()),
|
| + allocator_(FLAG_trace_gc_object_stats ? new VerboseAccountingAllocator(
|
| + &heap_, 256 * KB, 128 * KB)
|
| + : new AccountingAllocator()),
|
| inner_pointer_to_code_cache_(NULL),
|
| global_handles_(NULL),
|
| eternal_handles_(NULL),
|
|
|