# V8 CPU 和内存分析

> For the complete documentation index, see [llms.txt](https://www.jetbrains.com/zh-cn/help/idea/llms.txt).

> **TL;DR**
> 所需插件：
>
>
>
> `JavaScript 和 TypeScript`  -  插件与 IntelliJ IDEA 捆绑在一起，并默认启用。
>
>
>
> `Node.js` （仅用于开发 Node.js 应用程序） -  在   设置 | 插件   页面上安装插件。 该插件仅在拥有 Ultimate 订阅的 IntelliJ IDEA 中可用。

通过 IntelliJ IDEA，您可以使用 [V8 的基于样本的分析器](https://v8.dev/docs/profile) 捕获和分析  Node.js  应用程序的 CPU 配置文件和堆快照。

您还可以打开并查看在 Google Chrome DevTools 中捕获的快照，以检查您的客户端代码。

## 开始之前

Procedure:

1. 下载并安装 [Node.js](http://nodejs.org/#download)。

2. 请确保已在设置中启用  JavaScript 和 TypeScript  插件。 按 `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS))打开设置，然后选择  `插件` 。 在搜索字段中，键入  JavaScript 和 TypeScript 。 有关插件的更多信息，请参阅 [管理插件](managing-plugins.html)。

3. 按照 [从 JetBrains Marketplace 安装插件](managing-plugins.html#install_plugin_from_repo)中所述，在   设置 | 插件  页面上安装并启用  Node.js 插件。 该插件仅在拥有 Ultimate 订阅的 IntelliJ IDEA 中可用。

## CPU 分析

CPU 分析有助于您更好地了解代码中哪些部分占用了最多的 CPU 时间，以及您的代码是如何由 V8 JavaScript 引擎执行和优化的。

IntelliJ IDEA 中的 Node.js CPU 分析基于 V8 内置的 CPU 分析器，可提供有关代码执行和 JavaScript 引擎自身行为的信息，包括垃圾回收周期、编译和重新编译以及代码优化。

分析器会在称为 ticks 的特定时间间隔内拍摄快照。 不仅对您的代码进行测量，还对引擎自身执行的活动进行测量，例如编译、系统库调用、优化和垃圾回收。

Procedure: 启用 CPU 分析

要在应用启动时调用 V8 CPU 分析，您需要在   Node.js   运行配置中指定其他设置。

1. 前往  `运行 | 编辑配置` 。 或者，在工具栏上的   运行   小部件中选择   编辑配置  。

![打开编辑配置对话框](https://resources.jetbrains.com/help/img/idea/2026.3/ws_node_run_config_create.png)

在打开的   编辑配置  对话框中，点击工具栏上的   添加  按钮（ !["添加"按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.general.add.svg)），然后从列表中选择   Node.js  。

2. 从列表中选择  Node.js  运行配置以激活 CPU Profiling 或按照 [运行和调试 Node.js](running-and-debugging-node-js.html) 中的描述创建一个新配置。

3. 切换到   V8 分析   选项卡，并选中   记录 CPU 分析信息   复选框。 在   日志文件夹  字段中，指定存储记录日志的文件夹路径，日志文件命名为  `isolate-<session number>` 。

![V8 profiler 选项卡](https://resources.jetbrains.com/help/img/idea/2026.3/ws_v8_profiler_tab.png)

Procedure: 收集 CPU 分析信息

1. 从主工具栏的列表中选择运行配置，然后点击 ![运行按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.run.run.svg)，或从主菜单中选择  `运行 | 运行 <configuration name>` 。

2. 当您需要分析的场景被执行时，请点击工具栏上的 ![停止按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.actions.suspend.svg)停止该进程。

### 分析 CPU 分析日志

当您停止应用程序时，IntelliJ IDEA 会自动打开   V8 分析   工具窗口，并在其中显示收集到的性能分析数据。 如果窗口已打开并显示另一个会话收集的数据，IntelliJ IDEA 会打开一个新选项卡。 已自动打开的选项卡以控制应用程序执行和收集分析数据的运行配置命名。

要打开并分析一些先前保存的性能分析数据，请转到  `帮助 | 查找操作` （或按 `Ctrl+Shift+A` (Windows), `⌘ ⇧ A` (macOS), `⌘ ⇧ A` (IntelliJ IDEA Classic (macOS)), `⌘ ⇧ P` (macOS System Shortcuts), `Ctrl+Shift+A` (XWin), `Ctrl+Shift+A` (GNOME), `Ctrl+Shift+A` (KDE), `Escape, X` (Emacs), `Ctrl+Shift+P` (Sublime Text), `⌘ ⇧ P` (Sublime Text (macOS)), `Ctrl+Shift+A` (Visual Studio), `⌘ ⇧ A` (Visual Studio (macOS)), `Ctrl+I` (NetBeans), `Ctrl+Shift+A` (Eclipse), `⌘ 3` (Eclipse (macOS))），开始输入  `V8` ，并从列表中选择   分析 V8 分析日志  。

![打开先前保存的 Profiling 日志](https://resources.jetbrains.com/help/img/idea/2026.3/ws_v8_open_saved_profiling_data.png)

然后选择相关的 V8 日志文件  `isolate-<session number>` 。 IntelliJ IDEA 会使用所选日志文件的名称创建一个单独的选项卡。

基于收集的分析数据，IntelliJ IDEA 构建了三个调用树，并在每个独立窗格中显示它们。 借助这些调用树，可以从两个不同视图分析应用程序执行情况：一方面，哪些调用耗时较长（“重”），另一方面，“谁调用了谁”。

#### 理解调用树中的指标

调用树使用  Total  和  Self  指标，表示函数中的滴答计数或其与总执行时间的比率：

* 总计 显示了在一个函数内及其调用的函数中花费的总时间。

* Self 显示仅在函数内部花费的时间，不包括其子节点。

父级  度量显示了一个函数的纯执行时间与调用它的函数（  父级 ）的执行时间之比。

#### V8 优化器

在某些情况下，V8 会优化您的代码。 如需更多信息，请参阅 [Optimizing for V8](http://floitsch.blogspot.de/2012/03/optimizing-for-v8-introduction.html)。

* 函数名称前的星号 `*` 表示该函数已被优化。

* 波浪号 `~` 表示该功能可能需要优化，但尚未进行优化。 引擎可能会推迟优化或跳过优化，如果代码是短期运行的，但是波浪号指示了可以重写代码以实现更好性能的地方。

#### 调用树顶部

通话排行   窗格按  Self  度量标准以降序列出了执行的活动。 对于每个活动，会显示其  总计 、  总计% 和  自占% 指标。 对于每个函数／方法调用，IntelliJ IDEA 会显示定义该函数／方法的文件名称、行号和列号。

![V8 CPU 分析：调用树顶部](https://resources.jetbrains.com/help/img/idea/2026.3/v8ProfilerCPUTopCalls.png)

在   概述  窗格中，图表显示了  Self 时间在  Self% 度量值高于 1% 的调用中的分布。

#### 自底向上树

> **Tip:**
> 自底向上   树在您遇到  重度  函数并想要找出它从哪里被调用时很有帮助。

自底向上   面板还会按  Self  指标以降序列出已执行的活动。 与   通话排行  窗格不同，   自底向上  窗格仅显示  Total% 指标高于 2 的活动及调用它们的函数。

* 对于每项活动，会显示其以 tick 为单位的执行时间以及 父级占比 指标。

* 对于每个函数／方法调用，IntelliJ IDEA 会显示定义该函数／方法的文件名称、行号和列号。

![V8 CPU 性能分析：自下而上的树](https://resources.jetbrains.com/help/img/idea/2026.3/v8ProfilerCPUBottomUp.png)

#### 自上而下树

自上而下   面板显示整个调用层次结构，执行入口点的函数显示在顶部。 对于每个活动，将显示其  总计 、  总计% 、  自有 及  自有% 指标。 对于每个函数／方法调用，IntelliJ IDEA 会显示定义该函数／方法的文件名称、行号和列号。

![V8 分析：自顶向下树](https://resources.jetbrains.com/help/img/idea/2026.3/v8ProfilerCPUTopDown.png)

Procedure: 在调用树中导航

* 要导航到函数的源代码，请选择此函数并按下工具栏上的 `F4` (Windows), `⌘ ↓` (macOS), `F4` (IntelliJ IDEA Classic (macOS)), `F4` (macOS System Shortcuts), `F4` (XWin), `F4` (GNOME), `F4` (KDE), `F4` (Emacs), `F4` (Sublime Text), `F4` (Sublime Text (macOS)), `F4` (Visual Studio), `⌘ ↓` (Visual Studio (macOS)), `F4` (NetBeans), `F12` (Eclipse), `F3` (Eclipse (macOS)) 或 ![编辑按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.general.edit.svg)，或从上下文菜单中选择   跳转到源  。

* 要切换到另一个窗格并从另一个角度检查调用，请选择调用并从调用的上下文菜单中选择   导航到  ，然后选择目的地。 IntelliJ IDEA 切换到所选窗格并将焦点移动到调用。

Procedure: 展开或折叠节点

当 IntelliJ IDEA 为性能分析会话打开一个选项卡时，默认情况下它会展开负载最重的节点。 在浏览这些树时，您可能希望折叠其中一些节点或展开其他节点。

* 要展开或折叠节点，请从其上下文菜单中选择   展开节点   或   折叠节点  。

* 要折叠活动窗格中的所有节点，请点击工具栏上的 ![全部折叠按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.general.collapseAll.svg)。

* 若要恢复原始树形视图，请点击 !["展开高负载跟踪"按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.general.expandAll.svg)。

Procedure: 筛选出轻量调用

这样做可以只查看真正导致性能问题的调用。

* 点击 ![筛选按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.general.filter.svg)，然后使用滑块指定要显示的调用的最小  Total% 或  Parent% 值，然后点击   完成  。

Procedure: 保存并比较分析数据

* 要保存带有函数及其度量的行，请从该函数的上下文菜单中选择   复制  。 这可能会有所帮助，如果您想比较一个函数在两个会话中的测量结果，例如，在您对代码进行一些改进之后。

* 要仅保存函数名和其定义所在文件的名称，您可以从函数的上下文菜单中选择   复制调用  。

* 要将项目与剪贴板内容进行比较，请从项目的上下文菜单中选择   与剪贴板比较  。 IntelliJ IDEA 会打开  差异查看器 。

* 要将当前日志与另一隔离区进行比较，请点击工具栏上的 ![“Compare with”按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app-client.expui.vcs.diff.svg)。 在打开的对话框中，选择要与当前隔离进行比较的隔离。 若要缩小搜索范围，请指定目标隔离是当前隔离前还是之后进行的。

Procedure: 导出调用树

* 要将当前窗格中的调用树保存到文本文件，请点击工具栏上的 ![导出按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.general.export.svg)，然后在打开的对话框中指定目标文件。

#### 分析火焰图

使用多色   火焰图  查找应用程序暂停的位置，并探索导致这些暂停的调用。

![火焰图](https://resources.jetbrains.com/help/img/idea/2026.3/ws_v8_profiler_flame_chart.png)

该图表由四个区域组成：

* 上部区域显示了一个时间轴，并带有两个滑块，用于限制要调查的片段的开始和结束。

* 底部区域显示一个多彩图表形式的调用堆栈。 首次调用时，每个函数会被分配一个随机颜色，此后在当前会话中每次调用此函数都会显示为该颜色。

* 中间区域显示了从 Garbage Collector 、引擎、外部调用以及执行本身的调用汇总。 为这些活动保留的颜色列在区域顶部。

* 右侧窗格列出了所选片段中的调用，对于每个调用，该列表显示其持续时间、被调用函数的名称以及函数定义所在的文件。

底部和右侧区域是同步的：当您在底部区域的时间轴上拖动滑块时，右侧窗格的焦点会移动到每个时刻执行的调用。

此外，如果您点击底部区域中的调用，滑块会自动移动到该调用，右侧窗格中的焦点会切换到相应的函数，如有必要，列表会自动滚动。 相反，如果您点击列表中的某个项目，IntelliJ IDEA 会选择底部区域中相应的调用，并自动将滑块拖动到该位置：

Procedure: 在时间轴中选择片段

* 要探索特定时间段内的进程，您需要在时间轴中选择相应的片段。 要执行此操作，请拖动滑块或点击两个滑块之间的  窗口 并将其拖动到所需的片段。

无论哪种情况，下面的多色图表显示了所选片段内的调用堆栈。

* 要放大图表，请点击所选部分，然后在工具栏上点击 ![Zoom 按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.general.zoomIn.svg)。 IntelliJ IDEA 打开一个新选项卡，并显示选定的片段以适应选项卡宽度放大，使您可以更详细地检查片段。

Procedure: 浏览 Flame Chart

从右侧区域的调用中，您可以跳转到被调用函数的源代码、工具窗口的其他窗格以及具有特定指标的火焰图区域。

* 要跳转到被调用函数的源代码，请从调用的上下文菜单中选择   跳转到源  。

* 要将火焰图缩放到具有特定调用指标的片段，请选择调用并从调用的上下文菜单中选择   导航到  ，然后选择指标。

* 您还可以导航到调用的堆栈跟踪以查看和分析异常。 要做到这一点，请从调用的上下文菜单中选择   显示为堆栈跟踪  。 IntelliJ IDEA 在单独的选项卡中打开堆栈跟踪，要返回到   火焰图  面板，请点击底部的   V8 CPU 分析  工具窗口按钮。

## 内存分析

内存分析使您能够检测内存泄漏和动态内存问题，并定位导致这些问题的代码片段。

Procedure: 启用内存分析

要在应用程序启动时调用内存快照，您需要在   Node.js   运行配置中指定其他设置。

1. 前往  `运行 | 编辑配置` 。 或者，在工具栏上的   运行   小部件中选择   编辑配置  。

![打开编辑配置对话框](https://resources.jetbrains.com/help/img/idea/2026.3/ws_node_run_config_create.png)

在打开的   编辑配置  对话框中，点击工具栏上的   添加  按钮（ !["添加"按钮](https://resources.jetbrains.com/help/img/idea/2026.3/调试配置](running-and-debugging-node-js.html#Node.js_run) 中的描述创建一个新配置。

3. 切换到   V8 分析   选项卡，并选中   允许获取堆快照   复选框。

Procedure: 收集内存分析信息

1. 从主工具栏的列表中选择运行配置，然后点击 ![运行按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.run.run.svg)，或从主菜单中选择  `运行 | 运行 <configuration name>` 。

2. 在应用程序执行期间的任何时候，点击 ![“拍摄堆快照”按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.actions.startMemoryProfile.svg) 位于   运行   工具窗口的工具栏上。

3. 在打开的对话框中，指定快照的名称及其存储文件夹的路径。 要立即开始分析快照，请选中   打开快照   复选框。

### 分析内存快照

当您拍摄快照并选择分析它时，IntelliJ IDEA 将打开   V8 堆   工具窗口并显示收集到的数据。 如果窗口已打开并显示另一个会话收集的数据，IntelliJ IDEA 会打开一个新选项卡。

要打开并分析一些先前保存的内存性能分析数据，请转到  `帮助 | 查找操作` （或按 `Ctrl+Shift+A` (Windows), `⌘ ⇧ A` (macOS), `⌘ ⇧ A` (IntelliJ IDEA Classic (macOS)), `⌘ ⇧ P` (macOS System Shortcuts), `Ctrl+Shift+A` (XWin), `Ctrl+Shift+A` (GNOME), `Ctrl+Shift+A` (KDE), `Escape, X` (Emacs), `Ctrl+Shift+P` (Sublime Text), `⌘ ⇧ P` (Sublime Text (macOS)), `Ctrl+Shift+A` (Visual Studio), `⌘ ⇧ A` (Visual Studio (macOS)), `Ctrl+I` (NetBeans), `Ctrl+Shift+A` (Eclipse), `⌘ 3` (Eclipse (macOS))，开始输入  `V8` ，并从列表中选择   分析 V8 堆快照  ）。

![打开先前保存的堆快照](https://resources.jetbrains.com/help/img/idea/2026.3/ws_v8_open_saved_heap_snapshot.png)

然后选择相关的  `.heapsnapshot` 文件。 IntelliJ IDEA 会创建一个以所选文件名称命名的单独标签。

工具窗口有三个选项卡，分别从不同的角度展示收集的信息。

* 包含关系 选项卡显示了您的应用程序中按几个顶级条目分组的对象： DOMWindow 对象 、 本机浏览器对象 和 GC 根 ，它们是 垃圾回收器 实际使用的根。 如需更多信息，请参阅 [Containment View](https://developer.chrome.com/devtools/docs/javascript-memory-profiling#containment-view)。 对于每个对象，标签显示其 距离 GC root 的距离 ，即对象与 GC root 之间节点的最短简单路径、对象的 [浅表大小](https://developer.chrome.com/devtools/docs/javascript-memory-profiling#shallow-size)和对象的 [保留大小](https://developer.chrome.com/devtools/docs/javascript-memory-profiling#retained-size)。 除了对象大小的绝对值外，IntelliJ IDEA 还显示对象占用的内存百分比。

* 最大对象 选项卡按 [占用大小](https://developer.chrome.com/devtools/docs/javascript-memory-profiling#retained-size) 对内存消耗最大的对象进行排序。 在此选项卡中，您可以发现由于在某个全局对象中累积数据而引发的内存泄漏。

* 总结 选项卡显示按类型分组的应用程序中的对象。 该选项卡显示每种类型对象的数量、它们的大小以及它们所占内存的百分比。 这些信息可能是内存状态的线索。

每个选项卡都有一个   详细信息  窗格，该窗格显示从 GC 根到当前选择对象的路径以及对象的  保留者 列表，即保留对所选对象的链接的对象。 每个堆快照都有许多“后向”引用和循环，因此每个对象始终有许多保留器。

Procedure: 用文本标签标记对象

标签帮助您区分对象并在不丢失上下文的情况下从一个对象移动到另一个对象。

* 要给对象设置标签，请选择对象并点击工具栏上的 ![“标记”按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.actions.checked.svg) 或从上下文菜单中选择   马克  。 然后在打开的对话框中指定文本标签。

Procedure: 浏览快照

* 要导航到与对象对应的函数或变量，请选择此对象并点击工具栏上的 ![编辑器按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.general.edit.svg) 或从上下文菜单中选择   编辑源  。 如果按钮和菜单选项被禁用，这意味着 IntelliJ IDEA 没有找到与所选对象对应的任何函数或变量。

如果找到多个函数或变量，IntelliJ IDEA 会在建议列表中显示它们。

* 为了帮助您从包含关系的角度调查对象并集中关注对象之间的链接，IntelliJ IDEA 允许您从   最大对象  或   总结  选项卡或   事件  视图中的对象跳转到   包含关系  选项卡中的同一对象。

要执行此操作，选择对象并从上下文菜单中选择   在主树中导航  。

Procedure: 通过快照搜索

1. 在   包含关系   选项卡中，点击工具栏上的 ![查找按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.toolwindow.find.svg)。

2. 在打开的   V8 堆搜索  对话框中，指定搜索模式和搜索范围。 可用的范围有：

* 到处都是： 选中此复选框以在所有范围内搜索。 选中此复选框时，所有其他搜索类型将被禁用。

* 链接名称： 选中这个复选框，以在调用 V8 创建 C++ 运行时 时搜索对象名称。 在 V8 堆 工具窗口中，链接名称标有 `%` 字符 `%<link name>` 。

* 类名： 选择此复选框以在函数构造器中进行搜索。

* 文本字符串： 选中此复选框以在对象内容中执行文本搜索。

* 快照对象 ID： 选中此复选框以在对象的唯一标识符中搜索。 V8 在对象创建时以这种格式为每个对象分配一个唯一标识符，并在对象被销毁之前保留它。 这意味着您可以在同一会话中拍摄的多个快照内查找和比较相同的对象。 在 V8 堆 工具窗口中，对象 ID 用 `@` 字符 `@<object id>` 标记。

* 标记： 选择此复选框可以在您通过点击 ![“标记”按钮](https://resources.jetbrains.com/help/img/idea/2026.3/调试配置：Node.js](run-debug-configuration-node-js.html)

