最常见的是事件监听器未正确移除和长期持有未使用的大对象或数据。
事件监听器未正确移除:
场景:在小程序中添加了事件监听器(例如页面监听器、定时器、网络请求等),但在页面卸载或组件销毁时未正确移除,导致监听器仍然存在,从而无法被垃圾回收器释放。
示例代码:
Page({
onLoad() {
this.timer = setInterval(() => {
console.log('Interval callback');
}, 1000);
},
onUnload() {
clearInterval(this.timer); // 在页面卸载时清除定时器
}
});
页面(Page)中的定时器:如果在页面的onUnload函数中没有清除定时器,这些定时器将会继续持有对页面对象的引用,可能会导致页面在卸载后仍然无法被完全释放,直到定时器函数执行完毕或被手动清除。
组件(Component)中的定时器:同理
长期持有未使用的大对象或数据:
场景: 当页面或组件持有大量的数据或对象(例如:长列表不断下拉),而这些数据在后续的操作中不再被使用,但由于被持有而无法被释放。
示例:
// 持有大量数据的例子
Page({
data: {
largeData: [], // 假设这是一个很大的数据数组
},
onLoad() {
// 加载大量数据到页面中
this.setData({
largeData: Array.from({ length: 10000 }, (_, index) => `Item ${index + 1}`),
});
},
onUnload() {
// 在页面卸载时,如果不再需要 largeData,应该置空释放内存
this.setData({
largeData: [],
});
}
});
循环引用导致的对象无法释放:
场景: 当两个对象互相引用,且存在至少一个对象被全局变量或闭包所引用时,这种循环引用会导致对象无法被垃圾回收,从而引发内存泄漏。
示例:
// 循环引用示例
let obj1 = {};
let obj2 = {};
obj1.ref = obj2;
obj2.ref = obj1;
// 确保在不再需要时解除引用
obj1 = null;
obj2 = null;
频繁创建和销毁组件实例:
场景: 当页面频繁创建和销毁组件实例,而未能正确释放之前组件实例所占用的资源。
示例:
// 频繁创建和销毁组件示例
Page({
onTapCreateComponent() {
const componentInstance = this.selectComponent('#my-component');
if (!componentInstance) {
const newComponentInstance = this.selectComponent('#my-component');
// 如果频繁创建实例,应该在不再需要时及时销毁
newComponentInstance.destroy(); // 假设 destroy 方法用于销毁组件
}
}
});
当存在内存泄漏时,用户长期使用会导致小程序占用的内存越来越大,最后导致小程序闪退(被微信强制销毁)
可以用weakSet排查页面泄漏问题
weakSet是JavaScript中的一种数据结构,可以存储对象,并且存储的对象是弱引用的,即一个对象只被weakSet引用后,会被垃圾回收器回收。
可以通过打印weakSet的指向,知道里面的元素是否被垃圾回收器回收。
示例:
1.创建weakSet对象,用来存储需要监控的对象
// 在页面或组件的数据部分定义一个 WeakSet 对象
let monitoredObjects = new WeakSet();
2.添加需要监控的对象,在需要进行监控的地方(例如页面加载时),将需要监控的对象添加到weakSet中
// 示例:在 onLoad 生命周期函数中添加需要监控的对象
onLoad() {
let obj = {}; // 假设这是需要监控的对象
monitoredObjects.add(obj);
// 其他初始化操作
}
3.检查页面卸载时的情况,在页面卸载(例如onUnload生命周期)时,检查weakSet中的对象是否已被释放
// 示例:在 onUnload 生命周期函数中检查被监控对象的状态
onUnload() {
for (let obj of monitoredObjects) {
// 可以输出或者记录被监控对象的状态,用于排查问题
console.log('Monitored object:', obj);
}
// 清空 WeakSet 对象,准备下次使用
monitoredObjects = new WeakSet();
}
也可以用微信开发者工具或其他性能分析工具,监控和优化应用的内存使用情况,及时发现和解决潜在的内存泄漏问题