// Copyright 2024 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef INCLUDE_EXTERNAL_MEMORY_ACCOUNTER_H_ #define INCLUDE_EXTERNAL_MEMORY_ACCOUNTER_H_ #include #include "v8-isolate.h" namespace v8 { /** * This class is used to give V8 an indication of the amount of externally * allocated memory that is kept alive by JavaScript objects. V8 uses this to * decide when to perform garbage collections. Registering externally allocated * memory will trigger garbage collections more often than it would otherwise in * an attempt to garbage collect the JavaScript objects that keep the externally * allocated memory alive. Instances of ExternalMemoryAccounter check that the * reported external memory is back to 0 on destruction. */ class V8_EXPORT ExternalMemoryAccounter { public: /** * Returns the amount of external memory registered for `isolate`. */ static int64_t GetTotalAmountOfExternalAllocatedMemoryForTesting( const Isolate* isolate); ExternalMemoryAccounter() = default; ~ExternalMemoryAccounter(); ExternalMemoryAccounter(ExternalMemoryAccounter&&); ExternalMemoryAccounter& operator=(ExternalMemoryAccounter&&); ExternalMemoryAccounter(const ExternalMemoryAccounter&) = delete; ExternalMemoryAccounter& operator=(const ExternalMemoryAccounter&) = delete; /** * Reports an increase of `size` bytes of external memory. */ void Increase(Isolate* isolate, size_t size); /** * Reports an update of `delta` bytes of external memory. */ void Update(Isolate* isolate, int64_t delta); /** * Reports an decrease of `size` bytes of external memory. */ void Decrease(Isolate* isolate, size_t size); private: #ifdef V8_ENABLE_MEMORY_ACCOUNTING_CHECKS size_t amount_of_external_memory_ = 0; v8::Isolate* isolate_ = nullptr; #endif }; } // namespace v8 #endif // INCLUDE_EXTERNAL_MEMORY_ACCOUNTER_H_