Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit a22c21c

Browse filesBrowse 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
Copy full SHA for a22c21c

File tree

Expand file treeCollapse file tree

4 files changed

+440
-1
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

4 files changed

+440
-1
lines changed
Open diff view settings
Collapse file

‎doc/api/v8.md‎

Copy file name to clipboardExpand all lines: doc/api/v8.md
+90Lines changed: 90 additions & 0 deletions
  • Display the source diff
  • Display the rich diff
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
Collapse file

‎lib/v8.js‎

Copy file name to clipboardExpand all lines: lib/v8.js
+21-1Lines changed: 21 additions & 1 deletion
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.