Revision: 3089
Author: [email protected]
Date: Tue Oct 20 00:51:49 2009
Log: Add an API to V8 to get simple heap statistics.
Review URL: http://codereview.chromium.org/261037
http://code.google.com/p/v8/source/detail?r=3089

Modified:
  /branches/bleeding_edge/include/v8.h
  /branches/bleeding_edge/src/api.cc
  /branches/bleeding_edge/src/heap.cc
  /branches/bleeding_edge/src/heap.h
  /branches/bleeding_edge/src/spaces.h
  /branches/bleeding_edge/test/cctest/test-api.cc

=======================================
--- /branches/bleeding_edge/include/v8.h        Fri Oct 16 05:51:18 2009
+++ /branches/bleeding_edge/include/v8.h        Tue Oct 20 00:51:49 2009
@@ -2102,6 +2102,29 @@
  };


+/**
+ * Collection of V8 heap information.
+ *
+ * Instances of this class can be passed to v8::V8::HeapStatistics to
+ * get heap statistics from V8.
+ */
+class V8EXPORT HeapStatistics {
+ public:
+  HeapStatistics();
+  size_t total_heap_size() { return total_heap_size_; }
+  size_t used_heap_size() { return used_heap_size_; }
+
+ private:
+  void set_total_heap_size(size_t size) { total_heap_size_ = size; }
+  void set_used_heap_size(size_t size) { used_heap_size_ = size; }
+
+  size_t total_heap_size_;
+  size_t used_heap_size_;
+
+  friend class V8;
+};
+
+
  /**
   * Container class for static utility functions.
   */
@@ -2352,6 +2375,10 @@
     */
    static bool Dispose();

+  /**
+   * Get statistics about the heap memory usage.
+   */
+  static void GetHeapStatistics(HeapStatistics* heap_statistics);

    /**
     * Optional notification that the embedder is idle.
=======================================
--- /branches/bleeding_edge/src/api.cc  Fri Oct 16 05:51:18 2009
+++ /branches/bleeding_edge/src/api.cc  Tue Oct 20 00:51:49 2009
@@ -2609,6 +2609,15 @@
    i::V8::TearDown();
    return true;
  }
+
+
+HeapStatistics::HeapStatistics(): total_heap_size_(0), used_heap_size_(0)  
{ }
+
+
+void v8::V8::GetHeapStatistics(HeapStatistics* heap_statistics) {
+  heap_statistics->set_total_heap_size(i::Heap::CommittedMemory());
+  heap_statistics->set_used_heap_size(i::Heap::SizeOfObjects());
+}


  bool v8::V8::IdleNotification() {
=======================================
--- /branches/bleeding_edge/src/heap.cc Fri Oct 16 05:11:59 2009
+++ /branches/bleeding_edge/src/heap.cc Tue Oct 20 00:51:49 2009
@@ -125,6 +125,19 @@
        map_space_->Capacity() +
        cell_space_->Capacity();
  }
+
+
+int Heap::CommittedMemory() {
+  if (!HasBeenSetup()) return 0;
+
+  return new_space_.CommittedMemory() +
+      old_pointer_space_->CommittedMemory() +
+      old_data_space_->CommittedMemory() +
+      code_space_->CommittedMemory() +
+      map_space_->CommittedMemory() +
+      cell_space_->CommittedMemory() +
+      lo_space_->Size();
+}


  int Heap::Available() {
@@ -222,19 +235,34 @@
  void Heap::PrintShortHeapStatistics() {
    if (!FLAG_trace_gc_verbose) return;
    PrintF("Memory allocator,   used: %8d, available: %8d\n",
-         MemoryAllocator::Size(), MemoryAllocator::Available());
+         MemoryAllocator::Size(),
+         MemoryAllocator::Available());
    PrintF("New space,          used: %8d, available: %8d\n",
-         Heap::new_space_.Size(), new_space_.Available());
-  PrintF("Old pointers,       used: %8d, available: %8d\n",
-         old_pointer_space_->Size(), old_pointer_space_->Available());
-  PrintF("Old data space,     used: %8d, available: %8d\n",
-         old_data_space_->Size(), old_data_space_->Available());
-  PrintF("Code space,         used: %8d, available: %8d\n",
-         code_space_->Size(), code_space_->Available());
-  PrintF("Map space,          used: %8d, available: %8d\n",
-         map_space_->Size(), map_space_->Available());
+         Heap::new_space_.Size(),
+         new_space_.Available());
+  PrintF("Old pointers,       used: %8d, available: %8d, waste: %8d\n",
+         old_pointer_space_->Size(),
+         old_pointer_space_->Available(),
+         old_pointer_space_->Waste());
+  PrintF("Old data space,     used: %8d, available: %8d, waste: %8d\n",
+         old_data_space_->Size(),
+         old_data_space_->Available(),
+         old_data_space_->Waste());
+  PrintF("Code space,         used: %8d, available: %8d, waste: %8d\n",
+         code_space_->Size(),
+         code_space_->Available(),
+         code_space_->Waste());
+  PrintF("Map space,          used: %8d, available: %8d, waste: %8d\n",
+         map_space_->Size(),
+         map_space_->Available(),
+         map_space_->Waste());
+  PrintF("Cell space,         used: %8d, available: %8d, waste: %8d\n",
+         cell_space_->Size(),
+         cell_space_->Available(),
+         cell_space_->Waste());
    PrintF("Large object space, used: %8d, avaialble: %8d\n",
-         lo_space_->Size(), lo_space_->Available());
+         lo_space_->Size(),
+         lo_space_->Available());
  }
  #endif

=======================================
--- /branches/bleeding_edge/src/heap.h  Fri Oct 16 05:11:59 2009
+++ /branches/bleeding_edge/src/heap.h  Tue Oct 20 00:51:49 2009
@@ -260,6 +260,9 @@
    // more spaces are needed until it reaches the limit.
    static int Capacity();

+  // Returns the amount of memory currently committed for the heap.
+  static int CommittedMemory();
+
    // Returns the available bytes in space w/o growing.
    // Heap doesn't guarantee that it can allocate an object that requires
    // all available bytes. Check MaxHeapObjectSize() instead.
=======================================
--- /branches/bleeding_edge/src/spaces.h        Mon Oct  5 04:16:25 2009
+++ /branches/bleeding_edge/src/spaces.h        Tue Oct 20 00:51:49 2009
@@ -861,6 +861,10 @@

    // Current capacity without growing (Size() + Available() + Waste()).
    int Capacity() { return accounting_stats_.Capacity(); }
+
+  // Total amount of memory committed for this space.  For paged
+  // spaces this equals the capacity.
+  int CommittedMemory() { return Capacity(); }

    // Available bytes without growing.
    int Available() { return accounting_stats_.Available(); }
@@ -1252,11 +1256,19 @@

    // Return the allocated bytes in the active semispace.
    virtual int Size() { return top() - bottom(); }
+
    // Return the current capacity of a semispace.
    int Capacity() {
      ASSERT(to_space_.Capacity() == from_space_.Capacity());
      return to_space_.Capacity();
    }
+
+  // Return the total amount of memory committed for new space.
+  int CommittedMemory() {
+    if (from_space_.is_committed()) return 2 * Capacity();
+    return Capacity();
+  }
+
    // Return the available bytes without growing in the active semispace.
    int Available() { return Capacity() - Size(); }

=======================================
--- /branches/bleeding_edge/test/cctest/test-api.cc     Wed Oct 14 08:26:38 2009
+++ /branches/bleeding_edge/test/cctest/test-api.cc     Tue Oct 20 00:51:49 2009
@@ -8153,3 +8153,15 @@
      CHECK(stack_limit == set_limit);
    }
  }
+
+
+THREADED_TEST(GetHeapStatistics) {
+  v8::HandleScope scope;
+  LocalContext c1;
+  v8::HeapStatistics heap_statistics;
+  CHECK_EQ(heap_statistics.total_heap_size(), 0);
+  CHECK_EQ(heap_statistics.used_heap_size(), 0);
+  v8::V8::GetHeapStatistics(&heap_statistics);
+  CHECK_NE(heap_statistics.total_heap_size(), 0);
+  CHECK_NE(heap_statistics.used_heap_size(), 0);
+}

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to