Skip to content

Commit a22c21c

Browse files
Aditi-1400aduh95
authored andcommitted
v8: add v8.getCppHeapStatistics() method
Expose `CppHeap` data via `cppgc::CppHeap::CollectStatistics()` in the v8 module. PR-URL: #57146 Fixes: #56533 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Stephen Belanger <admin@stephenbelanger.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent d2f49e7 commit a22c21c

File tree

4 files changed

+440
-1
lines changed

4 files changed

+440
-1
lines changed

doc/api/v8.md

+90
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,92 @@ buffers and external strings.
271271
}
272272
```
273273

274+
## `v8.getCppHeapStatistics([detailLevel])`
275+
276+
Retrieves [CppHeap][] statistics regarding memory consumption and
277+
utilization using the V8 [`CollectStatistics()`][] function which
278+
may change from one V8 version to the
279+
next.
280+
281+
* `detailLevel` {string|undefined}: **Default:** `'detailed'`.
282+
Specifies the level of detail in the returned statistics.
283+
Accepted values are:
284+
* `'brief'`: Brief statistics contain only the top-level
285+
allocated and used
286+
memory statistics for the entire heap.
287+
* `'detailed'`: Detailed statistics also contain a break
288+
down per space and page, as well as freelist statistics
289+
and object type histograms.
290+
291+
It returns an object with a structure similar to the
292+
[`cppgc::HeapStatistics`][] object. See the [V8 documentation][`cppgc::HeapStatistics struct`]
293+
for more information about the properties of the object.
294+
295+
```js
296+
// Detailed
297+
({
298+
committed_size_bytes: 131072,
299+
resident_size_bytes: 131072,
300+
used_size_bytes: 152,
301+
space_statistics: [
302+
{
303+
name: 'NormalPageSpace0',
304+
committed_size_bytes: 0,
305+
resident_size_bytes: 0,
306+
used_size_bytes: 0,
307+
page_stats: [{}],
308+
free_list_stats: {},
309+
},
310+
{
311+
name: 'NormalPageSpace1',
312+
committed_size_bytes: 131072,
313+
resident_size_bytes: 131072,
314+
used_size_bytes: 152,
315+
page_stats: [{}],
316+
free_list_stats: {},
317+
},
318+
{
319+
name: 'NormalPageSpace2',
320+
committed_size_bytes: 0,
321+
resident_size_bytes: 0,
322+
used_size_bytes: 0,
323+
page_stats: [{}],
324+
free_list_stats: {},
325+
},
326+
{
327+
name: 'NormalPageSpace3',
328+
committed_size_bytes: 0,
329+
resident_size_bytes: 0,
330+
used_size_bytes: 0,
331+
page_stats: [{}],
332+
free_list_stats: {},
333+
},
334+
{
335+
name: 'LargePageSpace',
336+
committed_size_bytes: 0,
337+
resident_size_bytes: 0,
338+
used_size_bytes: 0,
339+
page_stats: [{}],
340+
free_list_stats: {},
341+
},
342+
],
343+
type_names: [],
344+
detail_level: 'detailed',
345+
});
346+
```
347+
348+
```js
349+
// Brief
350+
({
351+
committed_size_bytes: 131072,
352+
resident_size_bytes: 131072,
353+
used_size_bytes: 128864,
354+
space_statistics: [],
355+
type_names: [],
356+
detail_level: 'brief',
357+
});
358+
```
359+
274360
## `v8.queryObjects(ctor[, options])`
275361

276362
<!-- YAML
@@ -1343,12 +1429,14 @@ writeString('hello');
13431429
writeString('你好');
13441430
```
13451431

1432+
[CppHeap]: https://v8docs.nodesource.com/node-22.4/d9/dc4/classv8_1_1_cpp_heap.html
13461433
[HTML structured clone algorithm]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm
13471434
[Hook Callbacks]: #hook-callbacks
13481435
[V8]: https://developers.google.com/v8/
13491436
[`--heapsnapshot-near-heap-limit`]: cli.md#--heapsnapshot-near-heap-limitmax_count
13501437
[`AsyncLocalStorage`]: async_context.md#class-asynclocalstorage
13511438
[`Buffer`]: buffer.md
1439+
[`CollectStatistics()`]: https://v8docs.nodesource.com/node-22.4/d9/dc4/classv8_1_1_cpp_heap.html#a3a5d09567758e608fffde50eeabc2feb
13521440
[`DefaultDeserializer`]: #class-v8defaultdeserializer
13531441
[`DefaultSerializer`]: #class-v8defaultserializer
13541442
[`Deserializer`]: #class-v8deserializer
@@ -1362,6 +1450,8 @@ writeString('你好');
13621450
[`async_hooks`]: async_hooks.md
13631451
[`before` callback]: #beforepromise
13641452
[`buffer.constants.MAX_LENGTH`]: buffer.md#bufferconstantsmax_length
1453+
[`cppgc::HeapStatistics struct`]: https://v8docs.nodesource.com/node-22.4/df/d2f/structcppgc_1_1_heap_statistics.html
1454+
[`cppgc::HeapStatistics`]: https://v8docs.nodesource.com/node-22.4/d7/d51/heap-statistics_8h_source.html
13651455
[`deserializer._readHostObject()`]: #deserializer_readhostobject
13661456
[`deserializer.transferArrayBuffer()`]: #deserializertransferarraybufferid-arraybuffer
13671457
[`init` callback]: #initpromise-parent

lib/v8.js

+21-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ const {
3737
} = primordials;
3838

3939
const { Buffer } = require('buffer');
40-
const { validateString, validateUint32 } = require('internal/validators');
40+
const {
41+
validateString,
42+
validateUint32,
43+
validateOneOf,
44+
} = require('internal/validators');
4145
const {
4246
Serializer,
4347
Deserializer,
@@ -146,6 +150,8 @@ const {
146150
heapStatisticsBuffer,
147151
heapCodeStatisticsBuffer,
148152
heapSpaceStatisticsBuffer,
153+
getCppHeapStatistics: _getCppHeapStatistics,
154+
detailLevel,
149155
} = binding;
150156

151157
const kNumberOfHeapSpaces = kHeapSpaces.length;
@@ -271,6 +277,19 @@ function setHeapSnapshotNearHeapLimit(limit) {
271277
_setHeapSnapshotNearHeapLimit(limit);
272278
}
273279

280+
const detailLevelDict = {
281+
__proto__: null,
282+
detailed: detailLevel.DETAILED,
283+
brief: detailLevel.BRIEF,
284+
};
285+
286+
function getCppHeapStatistics(type = 'detailed') {
287+
validateOneOf(type, 'type', ['brief', 'detailed']);
288+
const result = _getCppHeapStatistics(detailLevelDict[type]);
289+
result.detail_level = type;
290+
return result;
291+
}
292+
274293
/* V8 serialization API */
275294

276295
/* JS methods for the base objects */
@@ -442,6 +461,7 @@ module.exports = {
442461
getHeapStatistics,
443462
getHeapSpaceStatistics,
444463
getHeapCodeStatistics,
464+
getCppHeapStatistics,
445465
setFlagsFromString,
446466
Serializer,
447467
Deserializer,

0 commit comments

Comments
 (0)