最常見的是事件監聽器未正確移除和長期持有未使用的大對象或數據。
事件監聽器未正確移除:
場景:在小程序中添加了事件監聽器(例如頁面監聽器、定時器、網絡請求等),但在頁面卸載或組件銷毀時未正確移除,導致監聽器仍然存在,從而無法被垃圾回收器釋放。
示例代碼:
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();
}
也可以用微信開發者工具或其他性能分析工具,監控和優化應用的內存使用情況,及時發現和解決潛在的內存泄漏問題