Browse Source

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 năm trước cách đây
mục cha
commit
9aaf19f4de

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

@@ -58,8 +58,14 @@ Heap::~Heap()
 
 
 Cell* Heap::allocate_cell(size_t size)
 Cell* Heap::allocate_cell(size_t size)
 {
 {
-    if (should_collect_on_every_allocation())
+    if (should_collect_on_every_allocation()) {
         collect_garbage();
         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) {
     for (auto& block : m_blocks) {
         if (size > block->cell_size())
         if (size > block->cell_size())

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

@@ -78,6 +78,9 @@ private:
 
 
     Cell* cell_from_possible_pointer(FlatPtr);
     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 };
     bool m_should_collect_on_every_allocation { false };
 
 
     Interpreter& m_interpreter;
     Interpreter& m_interpreter;