瀏覽代碼

LibJS: Do a garbage collection every N allocations (N=10'000)

To prevent the heap from growing infinitely large, we now do a full GC
every 10'000 allocations. :^)
Andreas Kling 5 年之前
父節點
當前提交
9aaf19f4de
共有 2 個文件被更改,包括 10 次插入1 次删除
  1. 7 1
      Libraries/LibJS/Heap/Heap.cpp
  2. 3 0
      Libraries/LibJS/Heap/Heap.h

+ 7 - 1
Libraries/LibJS/Heap/Heap.cpp

@@ -58,8 +58,14 @@ Heap::~Heap()
 
 Cell* Heap::allocate_cell(size_t size)
 {
-    if (should_collect_on_every_allocation())
+    if (should_collect_on_every_allocation()) {
         collect_garbage();
+    } else if (m_allocations_since_last_gc > m_max_allocations_between_gc) {
+        m_allocations_since_last_gc = 0;
+        collect_garbage();
+    } else {
+        ++m_allocations_since_last_gc;
+    }
 
     for (auto& block : m_blocks) {
         if (size > block->cell_size())

+ 3 - 0
Libraries/LibJS/Heap/Heap.h

@@ -78,6 +78,9 @@ private:
 
     Cell* cell_from_possible_pointer(FlatPtr);
 
+    size_t m_max_allocations_between_gc { 10000 };
+    size_t m_allocations_since_last_gc { false };
+
     bool m_should_collect_on_every_allocation { false };
 
     Interpreter& m_interpreter;