v8: export more fields in getHeapStatistics

export total_global_handles_size, used_global_handles_size,
external_memory in getHeapStatistics

PR-URL: https://github.com/nodejs/node/pull/42784
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Darshan Sen <raisinten@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
theanarkh 2022-04-23 23:35:36 +08:00 committed by GitHub
parent c4781ea69c
commit 9cd2c277d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 41 additions and 15 deletions

View File

@ -180,6 +180,9 @@ Returns an object with the following properties:
* `does_zap_garbage` {number} * `does_zap_garbage` {number}
* `number_of_native_contexts` {number} * `number_of_native_contexts` {number}
* `number_of_detached_contexts` {number} * `number_of_detached_contexts` {number}
* `total_global_handles_size` {number}
* `used_global_handles_size` {number}
* `external_memory` {number}
`does_zap_garbage` is a 0/1 boolean, which signifies whether the `does_zap_garbage` is a 0/1 boolean, which signifies whether the
`--zap_code_space` option is enabled or not. This makes V8 overwrite heap `--zap_code_space` option is enabled or not. This makes V8 overwrite heap
@ -195,6 +198,15 @@ a memory leak.
of contexts that were detached and not yet garbage collected. This number of contexts that were detached and not yet garbage collected. This number
being non-zero indicates a potential memory leak. being non-zero indicates a potential memory leak.
`total_global_handles_size` The value of total\_global\_handles\_size is the
total memory size of V8 global handles.
`used_global_handles_size` The value of used\_global\_handles\_size is the
used memory size of V8 global handles.
`external_memory` The value of external\_memory is the memory size of array
buffers and external strings.
<!-- eslint-skip --> <!-- eslint-skip -->
```js ```js
@ -209,7 +221,10 @@ being non-zero indicates a potential memory leak.
peak_malloced_memory: 1127496, peak_malloced_memory: 1127496,
does_zap_garbage: 0, does_zap_garbage: 0,
number_of_native_contexts: 1, number_of_native_contexts: 1,
number_of_detached_contexts: 0 number_of_detached_contexts: 0,
total_global_handles_size: 8192,
used_global_handles_size: 3296,
external_memory: 318824
} }
``` ```

View File

@ -107,6 +107,9 @@ const {
kPeakMallocedMemoryIndex, kPeakMallocedMemoryIndex,
kNumberOfNativeContextsIndex, kNumberOfNativeContextsIndex,
kNumberOfDetachedContextsIndex, kNumberOfDetachedContextsIndex,
kTotalGlobalHandlesSizeIndex,
kUsedGlobalHandlesSizeIndex,
kExternalMemoryIndex,
// Properties for heap spaces statistics buffer extraction. // Properties for heap spaces statistics buffer extraction.
kHeapSpaces, kHeapSpaces,
@ -165,7 +168,10 @@ function getHeapStatistics() {
peak_malloced_memory: buffer[kPeakMallocedMemoryIndex], peak_malloced_memory: buffer[kPeakMallocedMemoryIndex],
does_zap_garbage: buffer[kDoesZapGarbageIndex], does_zap_garbage: buffer[kDoesZapGarbageIndex],
number_of_native_contexts: buffer[kNumberOfNativeContextsIndex], number_of_native_contexts: buffer[kNumberOfNativeContextsIndex],
number_of_detached_contexts: buffer[kNumberOfDetachedContextsIndex] number_of_detached_contexts: buffer[kNumberOfDetachedContextsIndex],
total_global_handles_size: buffer[kTotalGlobalHandlesSizeIndex],
used_global_handles_size: buffer[kUsedGlobalHandlesSizeIndex],
external_memory: buffer[kExternalMemoryIndex]
}; };
} }

View File

@ -47,19 +47,21 @@ using v8::Uint32;
using v8::V8; using v8::V8;
using v8::Value; using v8::Value;
#define HEAP_STATISTICS_PROPERTIES(V) \
#define HEAP_STATISTICS_PROPERTIES(V) \ V(0, total_heap_size, kTotalHeapSizeIndex) \
V(0, total_heap_size, kTotalHeapSizeIndex) \ V(1, total_heap_size_executable, kTotalHeapSizeExecutableIndex) \
V(1, total_heap_size_executable, kTotalHeapSizeExecutableIndex) \ V(2, total_physical_size, kTotalPhysicalSizeIndex) \
V(2, total_physical_size, kTotalPhysicalSizeIndex) \ V(3, total_available_size, kTotalAvailableSize) \
V(3, total_available_size, kTotalAvailableSize) \ V(4, used_heap_size, kUsedHeapSizeIndex) \
V(4, used_heap_size, kUsedHeapSizeIndex) \ V(5, heap_size_limit, kHeapSizeLimitIndex) \
V(5, heap_size_limit, kHeapSizeLimitIndex) \ V(6, malloced_memory, kMallocedMemoryIndex) \
V(6, malloced_memory, kMallocedMemoryIndex) \ V(7, peak_malloced_memory, kPeakMallocedMemoryIndex) \
V(7, peak_malloced_memory, kPeakMallocedMemoryIndex) \ V(8, does_zap_garbage, kDoesZapGarbageIndex) \
V(8, does_zap_garbage, kDoesZapGarbageIndex) \ V(9, number_of_native_contexts, kNumberOfNativeContextsIndex) \
V(9, number_of_native_contexts, kNumberOfNativeContextsIndex) \ V(10, number_of_detached_contexts, kNumberOfDetachedContextsIndex) \
V(10, number_of_detached_contexts, kNumberOfDetachedContextsIndex) V(11, total_global_handles_size, kTotalGlobalHandlesSizeIndex) \
V(12, used_global_handles_size, kUsedGlobalHandlesSizeIndex) \
V(13, external_memory, kExternalMemoryIndex)
#define V(a, b, c) +1 #define V(a, b, c) +1
static constexpr size_t kHeapStatisticsPropertiesCount = static constexpr size_t kHeapStatisticsPropertiesCount =

View File

@ -6,15 +6,18 @@ const v8 = require('v8');
const s = v8.getHeapStatistics(); const s = v8.getHeapStatistics();
const keys = [ const keys = [
'does_zap_garbage', 'does_zap_garbage',
'external_memory',
'heap_size_limit', 'heap_size_limit',
'malloced_memory', 'malloced_memory',
'number_of_detached_contexts', 'number_of_detached_contexts',
'number_of_native_contexts', 'number_of_native_contexts',
'peak_malloced_memory', 'peak_malloced_memory',
'total_available_size', 'total_available_size',
'total_global_handles_size',
'total_heap_size', 'total_heap_size',
'total_heap_size_executable', 'total_heap_size_executable',
'total_physical_size', 'total_physical_size',
'used_global_handles_size',
'used_heap_size']; 'used_heap_size'];
assert.deepStrictEqual(Object.keys(s).sort(), keys); assert.deepStrictEqual(Object.keys(s).sort(), keys);
keys.forEach(function(key) { keys.forEach(function(key) {