---
title: 内存优化
summary: "介绍小程序内存优化方法，包括避免内存泄漏、控制页面栈深度和管理数据规模。"
questions:
  - 小程序内存占用过高会导致什么后果？
  - 如何使用 onMemoryWarning 监听内存告警事件？
  - 页面卸载时为什么必须清理定时器？
  - 如何避免事件监听导致的内存泄漏？
  - navigateTo、redirectTo 和 reLaunch 在页面栈管理上有什么区别？
  - 如何控制页面栈深度以减少内存占用？
  - 在 data 或全局变量中存储过大数据会有什么问题？
  - 代码包体积如何影响运行时的内存占用？
  - 内存泄漏的常见表现有哪些？
  - 小程序内存优化的检查清单包括哪些项？
docType: default
---

# 内存优化

小程序运行在有限的系统资源中。当内存占用过高时，小程序可能被系统销毁或客户端主动回收，导致用户需要重新打开小程序，体验非常糟糕。

## 内存问题的表现

| 表现 | 可能原因 |
| ---- | -------- |
| 小程序突然闪退 | 内存占用过高，被系统回收 |
| 页面越用越卡 | 内存泄漏，可用内存逐渐减少 |
| 返回之前的页面变慢 | 页面栈过深，占用大量内存 |

## 监听内存告警

使用 [onMemoryWarning](/cn/miniapp/develop/miniapp/api/device/memory/onMemoryWarning) 监听内存告警事件，在收到告警时进行必要的内存清理：

```javascript
ty.onMemoryWarning(res => {
  console.warn('内存告警，级别:', res.level);
  // 进行必要的清理，如释放缓存、销毁临时数据等
});
```

## 避免内存泄漏

### 及时清理定时器

页面组件卸载时，必须清理关联的定时器：

```javascript
Page({
  onLoad() {
    this._timer = setInterval(() => {
      fetchLatestData();
    }, 5000);
  },
  onUnload() {
    if (this._timer) {
      clearInterval(this._timer); // 页面卸载时清理
      this._timer = null;
    }
  }
});
```

### 及时解绑事件监听

注册的事件监听在页面卸载时应及时解绑：

```javascript
Page({
  onLoad() {
    this._networkHandler = res => console.log('网络状态:', res.isConnected);
    ty.onNetworkStatusChange(this._networkHandler);
  },
  onUnload() {
    ty.offNetworkStatusChange(this._networkHandler);
  }
});
```

## 控制页面栈深度

页面栈过深会占用大量内存，合理选择导航方式：

| 方法 | 效果 | 适用场景 |
| ---- | ---- | -------- |
| `ty.navigateTo` | 新增一层页面栈 | 需要返回的页面跳转 |
| `ty.redirectTo` | 替换当前页面 | 不需要返回的跳转 |
| `ty.reLaunch` | 清空页面栈 | 登录后跳转首页等场景 |

## 控制数据规模

避免在 `data` 或全局变量中存储过大的数据，使用分页只保留当前展示所需的数据：

```javascript
Page({
  data: {
    list: [],
    page: 1,
  },
  loadMore() {
    const { page } = this.data;
    fetchProducts({ page, pageSize: 20 }).then(res => {
      this.setData({
        list: [...this.data.list, ...res.data], // 追加而非全量替换
        page: page + 1,
      });
    });
  }
});
```

## 控制代码包体积

代码包体积不仅影响下载耗时，也直接影响运行时的内存占用。代码包在加载时需要被解析和执行，体积越大，占用的内存越多。减小代码包体积是降低内存基线的有效手段之一。

详见[代码包体积优化](/cn/miniapp/develop/miniapp/guide/optimization/startup/package-size)。

## 检查清单

| 检查项 | 优化方法 |
| ------ | -------- |
| 定时器是否在页面卸载时清理 | 在 onUnload 中调用 clearInterval/clearTimeout |
| 事件监听是否在页面卸载时解绑 | 及时解绑事件监听 |
| 页面跳转方式是否合理 | 不需要返回的场景使用 redirectTo |
| 是否存储了过大的数据 | 使用分页加载，只保留当前页数据 |
