跳转到内容
搜索文档

分析内存

最后更新 查看 MarkdownAgent 设置

了解 Worker 内存使用情况有助于优化性能、在达到 Worker 内存限制 时避免内存不足(OOM)错误,以及修复内存泄漏。

您可以使用 DevTools 快照分析内存使用情况。内存快照让您查看内存使用摘要、了解不同数据类型占用的内存量,并获取内存中特定对象的详细信息。

使用 DevTools 分析内存时,可能难以复现生产环境中观察到的特定行为。要模拟生产行为,请确保发送到本地 Worker 的请求与生产环境中的请求相似。这可能意味着发送大量请求、向特定路由发送请求,或使用 --remote 标志配合类似生产环境的数据。

采集快照

要生成内存快照:

  • 运行 wrangler dev 启动 Worker
  • 在终端中按 D 键打开 DevTools
  • 选择 Memory(内存) 标签页
  • 向 Worker 发送请求以开始分配内存
    • 可选:包含调试器以确保能在合适的时间暂停执行
  • 选择 Take snapshot(拍摄快照)

您现在可以检查 Worker 内存。

快照示例

让我们通过一个示例学习如何阅读内存快照。假设您有以下 Worker:

index.jsjs
let responseText = "Hello world!";

export default {
	async fetch(request, env, ctx) {
		let now = new Date().toISOString();
		responseText = responseText + ` (Requested at: ${now})`;
		return new Response(responseText.slice(0, 53));
	},
};

这段代码最初运行良好,但随着时间推移,您注意到响应变慢并出现内存不足错误。使用 DevTools,您可以查明是否存在内存泄漏。

首先,如上所述,运行 wrangler dev 后按 D 键打开 DevTools。 然后,导航到 "Memory" 标签页。

接下来,通过发送请求生成大量流量。您可以使用 curl 或反复刷新浏览器。请注意,其他 Worker 可能需要更特定的请求才能复现内存泄漏。

然后,点击 "Take Snapshot" 按钮并查看结果。

首先,在下拉菜单中导航到 "Statistics" 以大致了解内存占用情况。

内存统计

查看这些统计数据,您可以看到大量内存(67 kB)用于字符串。这很可能是内存泄漏的来源。如果您发送更多请求并采集另一个快照,会看到此数字不断增长。

内存摘要

内存摘要按内存占用量列出数据类型。点击 "(string)" 后,您可以看到一个远大于其他的字符串。文本显示您反复追加 "Requested at" 和日期,无意中用越来越大的字符串覆盖了全局变量:

responseText = responseText + ` (Requested at: ${now})`;

使用 DevTools 的内存快照功能,您已识别出导致内存泄漏的对象和代码行。 现在可以通过小幅代码修改来修复它。

其他资源

要了解如何使用内存快照,请参阅 Google 关于内存堆快照的文档

要了解如何使用 DevTools 洞察 CPU 使用情况,请参阅 CPU 分析文档

这篇文档对您有帮助吗?