跳到主要内容

内存

2024年12月25日
柏拉文
越努力,越幸运

一、heap_size_used


1.1 认识

heapUsed: 当前已使用的堆内存量(字节)。

1.2 process.memoryUsage 计算

process.memoryUsage()Node.js 提供的一个内置方法,用于返回当前进程的内存使用情况。该方法返回一个包含多个内存相关属性的对象,包括:

  • heapTotalV8 引擎的堆内存的总量(单位:字节),即堆的大小。

  • heapUsedV8 引擎当前已使用的堆内存(单位:字节)。

  • externalV8 引擎之外的内存使用量(例如,C++ 绑定或其他外部资源占用的内存,单位:字节)。

  • rss:常驻集大小(Resident Set Size),即进程当前占用的物理内存大小(单位:字节)。

process.memoryUsage() 主要提供进程级别的内存统计信息,包含了堆的总大小、已用大小、外部内存(如 C++ 绑定)的使用情况以及进程的常驻集内存, 是 Node.js 级别的简化接口,适合快速查看进程内存的总体情况; v8.getHeapStatistics() 提供更详细的堆内存统计信息,具体到堆内存的不同区域(如新生代、老生代等)的使用情况, 适用于需要深入分析堆内存使用情况的场景。

这两者并不是完全替代的关系,而是可以结合使用。process.memoryUsage() 更适合监控整个进程的内存使用情况,而 v8.getHeapStatistics() 则为需要深入堆内存分析的场景提供了更多的细节。

// 获取 Node.js 进程的内存使用情况
function getMemoryUsageStats() {
const memoryStats = process.memoryUsage();

const heapSizeUsed = memoryStats.heapUsed; // 已用堆内存
const heapSizeTotal = memoryStats.heapTotal; // 总堆内存
const externalMemory = memoryStats.external; // 外部内存
const rss = memoryStats.rss; // 常驻内存集

console.log(`Heap Size Used: ${heapSizeUsed} bytes`);
console.log(`Heap Size Total: ${heapSizeTotal} bytes`);
console.log(`External Memory: ${externalMemory} bytes`);
console.log(`RSS: ${rss} bytes`);
}

// 每秒打印一次内存使用情况
setInterval(getMemoryUsageStats, 1000);

1.3 v8.getHeapStatistics 计算

v8.getHeapStatistics()V8 引擎提供的一个方法,它返回有关堆内存的详细信息。这个方法返回的信息比 process.memoryUsage() 更为详细,主要包括堆内存的各个区域的使用情况:

  • total_heap_sizeV8 引擎为堆分配的总内存大小(单位:字节)。

  • used_heap_sizeV8 引擎当前已使用的堆内存大小(单位:字节)。

  • heap_size_limit:堆内存的最大大小限制(单位:字节)。

  • total_available_size:堆内存可用的内存大小(单位:字节)。

process.memoryUsage() 主要提供进程级别的内存统计信息,包含了堆的总大小、已用大小、外部内存(如 C++ 绑定)的使用情况以及进程的常驻集内存, 是 Node.js 级别的简化接口,适合快速查看进程内存的总体情况; v8.getHeapStatistics() 提供更详细的堆内存统计信息,具体到堆内存的不同区域(如新生代、老生代等)的使用情况, 适用于需要深入分析堆内存使用情况的场景。

这两者并不是完全替代的关系,而是可以结合使用。process.memoryUsage() 更适合监控整个进程的内存使用情况,而 v8.getHeapStatistics() 则为需要深入堆内存分析的场景提供了更多的细节。

const v8 = require('v8');

const v8HeapStatistics = () => {
const heapStats = v8.getHeapStatistics();

// heap_size_used: 已使用的堆内存
const heapSizeUsed = heapStats.used_heap_size;

// heap_size_total: 堆的总内存大小
const heapSizeTotal = heapStats.total_heap_size;

// heap_size_available: 可用的堆内存大小
const heapSizeAvailable = heapStats.total_available_size;

console.log(`heap_size_used: ${heapSizeUsed} bytes`);
console.log(`heap_size_total: ${heapSizeTotal} bytes`);
console.log(`heap_size_available: ${heapSizeAvailable} bytes`);
};

setInterval(v8HeapStatistics, 1000);

二、heap_size_total


2.1 认识

heapTotal: 堆内存的总量(字节)。

2.2 process.memoryUsage 计算

process.memoryUsage()Node.js 提供的一个内置方法,用于返回当前进程的内存使用情况。该方法返回一个包含多个内存相关属性的对象,包括:

  • heapTotalV8 引擎的堆内存的总量(单位:字节),即堆的大小。

  • heapUsedV8 引擎当前已使用的堆内存(单位:字节)。

  • externalV8 引擎之外的内存使用量(例如,C++ 绑定或其他外部资源占用的内存,单位:字节)。

  • rss:常驻集大小(Resident Set Size),即进程当前占用的物理内存大小(单位:字节)。

process.memoryUsage() 主要提供进程级别的内存统计信息,包含了堆的总大小、已用大小、外部内存(如 C++ 绑定)的使用情况以及进程的常驻集内存, 是 Node.js 级别的简化接口,适合快速查看进程内存的总体情况; v8.getHeapStatistics() 提供更详细的堆内存统计信息,具体到堆内存的不同区域(如新生代、老生代等)的使用情况, 适用于需要深入分析堆内存使用情况的场景。

这两者并不是完全替代的关系,而是可以结合使用。process.memoryUsage() 更适合监控整个进程的内存使用情况,而 v8.getHeapStatistics() 则为需要深入堆内存分析的场景提供了更多的细节。

// 获取 Node.js 进程的内存使用情况
function getMemoryUsageStats() {
const memoryStats = process.memoryUsage();

const heapSizeUsed = memoryStats.heapUsed; // 已用堆内存
const heapSizeTotal = memoryStats.heapTotal; // 总堆内存
const externalMemory = memoryStats.external; // 外部内存
const rss = memoryStats.rss; // 常驻内存集

console.log(`Heap Size Used: ${heapSizeUsed} bytes`);
console.log(`Heap Size Total: ${heapSizeTotal} bytes`);
console.log(`External Memory: ${externalMemory} bytes`);
console.log(`RSS: ${rss} bytes`);
}

// 每秒打印一次内存使用情况
setInterval(getMemoryUsageStats, 1000);

2.3 v8.getHeapStatistics 计算

v8.getHeapStatistics()V8 引擎提供的一个方法,它返回有关堆内存的详细信息。这个方法返回的信息比 process.memoryUsage() 更为详细,主要包括堆内存的各个区域的使用情况:

  • total_heap_sizeV8 引擎为堆分配的总内存大小(单位:字节)。

  • used_heap_sizeV8 引擎当前已使用的堆内存大小(单位:字节)。

  • heap_size_limit:堆内存的最大大小限制(单位:字节)。

  • total_available_size:堆内存可用的内存大小(单位:字节)。

process.memoryUsage() 主要提供进程级别的内存统计信息,包含了堆的总大小、已用大小、外部内存(如 C++ 绑定)的使用情况以及进程的常驻集内存, 是 Node.js 级别的简化接口,适合快速查看进程内存的总体情况; v8.getHeapStatistics() 提供更详细的堆内存统计信息,具体到堆内存的不同区域(如新生代、老生代等)的使用情况, 适用于需要深入分析堆内存使用情况的场景。

这两者并不是完全替代的关系,而是可以结合使用。process.memoryUsage() 更适合监控整个进程的内存使用情况,而 v8.getHeapStatistics() 则为需要深入堆内存分析的场景提供了更多的细节。

const v8 = require('v8');

const v8HeapStatistics = () => {
const heapStats = v8.getHeapStatistics();

// heap_size_used: 已使用的堆内存
const heapSizeUsed = heapStats.used_heap_size;

// heap_size_total: 堆的总内存大小
const heapSizeTotal = heapStats.total_heap_size;

// heap_size_available: 可用的堆内存大小
const heapSizeAvailable = heapStats.total_available_size;

console.log(`heap_size_used: ${heapSizeUsed} bytes`);
console.log(`heap_size_total: ${heapSizeTotal} bytes`);
console.log(`heap_size_available: ${heapSizeAvailable} bytes`);
};

setInterval(v8HeapStatistics, 1000);

三、external_memory


3.1 认识

external: 外部内存(例如 C++ 插件、V8 之外的内存等)的使用量(字节)。

3.2 process.memoryUsage 计算

process.memoryUsage()Node.js 提供的一个内置方法,用于返回当前进程的内存使用情况。该方法返回一个包含多个内存相关属性的对象,包括:

  • heapTotalV8 引擎的堆内存的总量(单位:字节),即堆的大小。

  • heapUsedV8 引擎当前已使用的堆内存(单位:字节)。

  • externalV8 引擎之外的内存使用量(例如,C++ 绑定或其他外部资源占用的内存,单位:字节)。

  • rss:常驻集大小(Resident Set Size),即进程当前占用的物理内存大小(单位:字节)。

process.memoryUsage() 主要提供进程级别的内存统计信息,包含了堆的总大小、已用大小、外部内存(如 C++ 绑定)的使用情况以及进程的常驻集内存, 是 Node.js 级别的简化接口,适合快速查看进程内存的总体情况; v8.getHeapStatistics() 提供更详细的堆内存统计信息,具体到堆内存的不同区域(如新生代、老生代等)的使用情况, 适用于需要深入分析堆内存使用情况的场景。

这两者并不是完全替代的关系,而是可以结合使用。process.memoryUsage() 更适合监控整个进程的内存使用情况,而 v8.getHeapStatistics() 则为需要深入堆内存分析的场景提供了更多的细节。

// 获取 Node.js 进程的内存使用情况
function getMemoryUsageStats() {
const memoryStats = process.memoryUsage();

const heapSizeUsed = memoryStats.heapUsed; // 已用堆内存
const heapSizeTotal = memoryStats.heapTotal; // 总堆内存
const externalMemory = memoryStats.external; // 外部内存
const rss = memoryStats.rss; // 常驻内存集

console.log(`Heap Size Used: ${heapSizeUsed} bytes`);
console.log(`Heap Size Total: ${heapSizeTotal} bytes`);
console.log(`External Memory: ${externalMemory} bytes`);
console.log(`RSS: ${rss} bytes`);
}

// 每秒打印一次内存使用情况
setInterval(getMemoryUsageStats, 1000);

3.3 v8.getHeapStatistics 计算

v8.getHeapStatistics()V8 引擎提供的一个方法,它返回有关堆内存的详细信息。这个方法返回的信息比 process.memoryUsage() 更为详细,主要包括堆内存的各个区域的使用情况:

  • total_heap_sizeV8 引擎为堆分配的总内存大小(单位:字节)。

  • used_heap_sizeV8 引擎当前已使用的堆内存大小(单位:字节)。

  • heap_size_limit:堆内存的最大大小限制(单位:字节)。

  • total_available_size:堆内存可用的内存大小(单位:字节)。

process.memoryUsage() 主要提供进程级别的内存统计信息,包含了堆的总大小、已用大小、外部内存(如 C++ 绑定)的使用情况以及进程的常驻集内存, 是 Node.js 级别的简化接口,适合快速查看进程内存的总体情况; v8.getHeapStatistics() 提供更详细的堆内存统计信息,具体到堆内存的不同区域(如新生代、老生代等)的使用情况, 适用于需要深入分析堆内存使用情况的场景。

这两者并不是完全替代的关系,而是可以结合使用。process.memoryUsage() 更适合监控整个进程的内存使用情况,而 v8.getHeapStatistics() 则为需要深入堆内存分析的场景提供了更多的细节。

const v8 = require('v8');

const v8HeapStatistics = () => {
const heapStats = v8.getHeapStatistics();

// heap_size_used: 已使用的堆内存
const heapSizeUsed = heapStats.used_heap_size;

// heap_size_total: 堆的总内存大小
const heapSizeTotal = heapStats.total_heap_size;

// heap_size_available: 可用的堆内存大小
const heapSizeAvailable = heapStats.total_available_size;

console.log(`heap_size_used: ${heapSizeUsed} bytes`);
console.log(`heap_size_total: ${heapSizeTotal} bytes`);
console.log(`heap_size_available: ${heapSizeAvailable} bytes`);
};

setInterval(v8HeapStatistics, 1000);

四、resident_memory


4.1 认识

rss: 常驻内存集(Resident Set Size),即进程使用的总内存,包括所有的堆内存和外部内存等。

4.2 计算

process.memoryUsage()Node.js 提供的一个内置方法,用于返回当前进程的内存使用情况。该方法返回一个包含多个内存相关属性的对象,包括:

  • heapTotalV8 引擎的堆内存的总量(单位:字节),即堆的大小。

  • heapUsedV8 引擎当前已使用的堆内存(单位:字节)。

  • externalV8 引擎之外的内存使用量(例如,C++ 绑定或其他外部资源占用的内存,单位:字节)。

  • rss:常驻集大小(Resident Set Size),即进程当前占用的物理内存大小(单位:字节)。

process.memoryUsage() 主要提供进程级别的内存统计信息,包含了堆的总大小、已用大小、外部内存(如 C++ 绑定)的使用情况以及进程的常驻集内存, 是 Node.js 级别的简化接口,适合快速查看进程内存的总体情况; v8.getHeapStatistics() 提供更详细的堆内存统计信息,具体到堆内存的不同区域(如新生代、老生代等)的使用情况, 适用于需要深入分析堆内存使用情况的场景。

这两者并不是完全替代的关系,而是可以结合使用。process.memoryUsage() 更适合监控整个进程的内存使用情况,而 v8.getHeapStatistics() 则为需要深入堆内存分析的场景提供了更多的细节。

// 获取 Node.js 进程的内存使用情况
function getMemoryUsageStats() {
const memoryStats = process.memoryUsage();

const heapSizeUsed = memoryStats.heapUsed; // 已用堆内存
const heapSizeTotal = memoryStats.heapTotal; // 总堆内存
const externalMemory = memoryStats.external; // 外部内存
const rss = memoryStats.rss; // 常驻内存集

console.log(`Heap Size Used: ${heapSizeUsed} bytes`);
console.log(`Heap Size Total: ${heapSizeTotal} bytes`);
console.log(`External Memory: ${externalMemory} bytes`);
console.log(`RSS: ${rss} bytes`);
}

// 每秒打印一次内存使用情况
setInterval(getMemoryUsageStats, 1000);

五、heap_space_size_used


5.1 认识

v8.getHeapSpaceStatistics()V8 引擎提供的一个方法,它可以返回关于堆空间的详细统计信息。V8 将堆内存划分为多个空间,每个空间代表堆的不同区域,例如 新生代(new space老生代(old space代码空间(code space大型对象空间(large object space 等。

通过 v8.getHeapSpaceStatistics(),你可以得到关于各个堆空间的详细内存使用情况,该方法返回一个数组,每个元素代表一个堆空间的统计信息,包含以下字段:

  • space_name: 堆空间的名称(例如 new_space, old_space, code_space, large_object_space)。

  • space_size: 堆空间的总大小(字节)。

  • space_used_size: 堆空间的已用内存(字节)。

  • space_available_size: 堆空间的可用内存(字节)。

5.2 计算

基于 v8.getHeapSpaceStatistics() 的实现,用于获取各个堆空间的使用情况:

const v8 = require('v8');

// 计算堆空间使用情况
function getHeapSpaceUsage() {
const heapStats = v8.getHeapSpaceStatistics();

// 用于存储总的空间使用情况
let totalUsed = 0;
let totalSize = 0;
let totalAvailable = 0;

heapStats.forEach(space => {
totalUsed += space.space_used_size;
totalSize += space.space_size;
totalAvailable += space.space_available_size;

console.log(`Heap Space: ${space.space_name}`);
console.log(`Total Size: ${space.space_size} bytes`);
console.log(`Used Size: ${space.space_used_size} bytes`);
console.log(`Available Size: ${space.space_available_size} bytes`);
console.log('-----------------------------------------');
});

console.log('-----------------------------------------');
console.log(`Total Heap Used Size: ${totalUsed} bytes`);
console.log(`Total Heap Space Size: ${totalSize} bytes`);
console.log(`Total Heap Available Size: ${totalAvailable} bytes`);
}

// 每秒打印一次堆空间内存使用情况
setInterval(getHeapSpaceUsage, 1000);
  • totalUsed: 累加所有堆空间的已用内存。

  • totalSize: 累加所有堆空间的总内存。

  • totalAvailable: 累加所有堆空间的可用内存。

六、heap_space_size_total


6.1 认识

v8.getHeapSpaceStatistics()V8 引擎提供的一个方法,它可以返回关于堆空间的详细统计信息。V8 将堆内存划分为多个空间,每个空间代表堆的不同区域,例如 新生代(new space老生代(old space代码空间(code space大型对象空间(large object space 等。

通过 v8.getHeapSpaceStatistics(),你可以得到关于各个堆空间的详细内存使用情况,该方法返回一个数组,每个元素代表一个堆空间的统计信息,包含以下字段:

  • space_name: 堆空间的名称(例如 new_space, old_space, code_space, large_object_space)。

  • space_size: 堆空间的总大小(字节)。

  • space_used_size: 堆空间的已用内存(字节)。

  • space_available_size: 堆空间的可用内存(字节)。

6.2 计算

基于 v8.getHeapSpaceStatistics() 的实现,用于获取各个堆空间的使用情况:

const v8 = require('v8');

// 计算堆空间使用情况
function getHeapSpaceUsage() {
const heapStats = v8.getHeapSpaceStatistics();

// 用于存储总的空间使用情况
let totalUsed = 0;
let totalSize = 0;
let totalAvailable = 0;

heapStats.forEach(space => {
totalUsed += space.space_used_size;
totalSize += space.space_size;
totalAvailable += space.space_available_size;

console.log(`Heap Space: ${space.space_name}`);
console.log(`Total Size: ${space.space_size} bytes`);
console.log(`Used Size: ${space.space_used_size} bytes`);
console.log(`Available Size: ${space.space_available_size} bytes`);
console.log('-----------------------------------------');
});

console.log('-----------------------------------------');
console.log(`Total Heap Used Size: ${totalUsed} bytes`);
console.log(`Total Heap Space Size: ${totalSize} bytes`);
console.log(`Total Heap Available Size: ${totalAvailable} bytes`);
}

// 每秒打印一次堆空间内存使用情况
setInterval(getHeapSpaceUsage, 1000);
  • totalUsed: 累加所有堆空间的已用内存。

  • totalSize: 累加所有堆空间的总内存。

  • totalAvailable: 累加所有堆空间的可用内存。

七、heap_space_size_available


7.1 认识

v8.getHeapSpaceStatistics()V8 引擎提供的一个方法,它可以返回关于堆空间的详细统计信息。V8 将堆内存划分为多个空间,每个空间代表堆的不同区域,例如 新生代(new space老生代(old space代码空间(code space大型对象空间(large object space 等。

通过 v8.getHeapSpaceStatistics(),你可以得到关于各个堆空间的详细内存使用情况,该方法返回一个数组,每个元素代表一个堆空间的统计信息,包含以下字段:

  • space_name: 堆空间的名称(例如 new_space, old_space, code_space, large_object_space)。

  • space_size: 堆空间的总大小(字节)。

  • space_used_size: 堆空间的已用内存(字节)。

  • space_available_size: 堆空间的可用内存(字节)。

7.2 计算

基于 v8.getHeapSpaceStatistics() 的实现,用于获取各个堆空间的使用情况:

const v8 = require('v8');

// 计算堆空间使用情况
function getHeapSpaceUsage() {
const heapStats = v8.getHeapSpaceStatistics();

// 用于存储总的空间使用情况
let totalUsed = 0;
let totalSize = 0;
let totalAvailable = 0;

heapStats.forEach(space => {
totalUsed += space.space_used_size;
totalSize += space.space_size;
totalAvailable += space.space_available_size;

console.log(`Heap Space: ${space.space_name}`);
console.log(`Total Size: ${space.space_size} bytes`);
console.log(`Used Size: ${space.space_used_size} bytes`);
console.log(`Available Size: ${space.space_available_size} bytes`);
console.log('-----------------------------------------');
});

console.log('-----------------------------------------');
console.log(`Total Heap Used Size: ${totalUsed} bytes`);
console.log(`Total Heap Space Size: ${totalSize} bytes`);
console.log(`Total Heap Available Size: ${totalAvailable} bytes`);
}

// 每秒打印一次堆空间内存使用情况
setInterval(getHeapSpaceUsage, 1000);
  • totalUsed: 累加所有堆空间的已用内存。

  • totalSize: 累加所有堆空间的总内存。

  • totalAvailable: 累加所有堆空间的可用内存。