uni-app nvue + navigateTo切换导致app的JSE进程内存上涨
uni-app nvue + navigateTo切换导致app的JSE进程内存上涨
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | 11 | HBuilderX |
示例代码:
<template>
<view class="container">
<button @click="goto">跳转 test 页面</button>
</view>
</template>
<script>
export default {
methods: {
goto() {
uni.navigateTo({
url: '/pages/test/test'
})
}
}
}
</script>
<style scoped>
.container {
flex: 1;
justify-content: center;
align-items: center;
}
</style>
<template>
<view class="container">
<button @click="back">返回 index 页面</button>
</view>
</template>
<script>
export default {
methods: {
back() {
uni.navigateBack()
}
}
}
</script>
<style scoped>
.container {
flex: 1;
justify-content: center;
align-items: center;
}
</style>
操作步骤:
- 打开
index.nvue页面,点击按钮跳转到test.nvue; - 在
test.nvue页面点击返回; - 自动化测试程序来回循环以上步骤 10分钟;
- 通过如下命令查看内存:
adb shell dumpsys meminfo xxx
更多关于uni-app nvue + navigateTo切换导致app的JSE进程内存上涨的实战教程也可以访问 https://www.itying.com/category-93-b0.html
通过adb shell top查看手机内进程内存和cpu占用情况:
app初始化状态,内存占用也是比较低的;
更多关于uni-app nvue + navigateTo切换导致app的JSE进程内存上涨的实战教程也可以访问 https://www.itying.com/category-93-b0.html
步骤二:
反复150次的进出页面之后app的内存占用就会上涨,并且在一段时间(10分钟)内并没有回落
等官方吧,给你邀请了几个官方人员
谢谢
回复 qjr: 客气了
从现象看有可能存在内存泄漏的问题。
nvue目前已经停止维护了,这类问题处理优先级比较低,有条件建议升级使用 uni-app x 。
目前项目已经进行到最后的测试阶段了,除了升级成uni-app x还有其他的办法吗?
回复 qjr: 我们先排查确认下
回复 qjr: 办法是全部切成vue[doge]
回复 1***@qq.com: 本来就是vue切到nvue去开发app的,因为用到的video组件的地方比较多。
回复 DCloud_App_Array: 完成确认了吗?
回复 qjr: 这个默认是不维护的。虽然你也可以点付费技术支持,付费解决这个问题,但性价比不高。uni-app x是没有内存泄漏问题的,在产品层面就有内存泄漏监控。
回复 DCloud_heavensoft: 既然你们还继续支持nvue开发,这个问题这么严重,难道不应该公开一下解决方法吗?
回复 qjr: nvue是base在weex上的,这个已经是一个淘汰产物了。如果你是video组件用的多造成的,那有个简单的方法,回到vue,不用uni-app的video组件,而用renderjs,直接用html的createVideoElement。早期Android的webview的video不行,需要原生video,近6年的手机,用Webview的video就够了
回复 DCloud_heavensoft: 淘汰了你们倒是关掉nvue开发通道啊
这是一个典型的nvue页面内存累积问题。在uni-app的nvue架构中,每次使用navigateTo跳转页面时,即使调用navigateBack返回,页面实例也不会立即被销毁,而是保留在页面栈中用于快速恢复。
内存上涨的主要原因:
- 页面实例未及时回收:nvue页面使用原生渲染,页面实例比vue页面更重,频繁跳转会导致多个页面实例同时存在于内存中
- 页面栈管理机制:uni-app默认会缓存一定数量的页面实例以优化性能
- 原生组件资源:nvue中的原生组件(如view、text等)会占用更多原生内存
解决方案:
- 使用redirectTo替代navigateTo:
uni.redirectTo({
url: '/pages/test/test'
})
redirectTo会关闭当前页面直接跳转,避免页面栈堆积。
- 手动管理页面生命周期: 在页面的onUnload生命周期中主动释放资源:
onUnload() {
// 清理定时器、事件监听等
this.timer && clearTimeout(this.timer)
}
- 调整页面缓存策略: 在pages.json中配置页面缓存:
{
"path": "pages/test/test",
"style": {
"navigationBarTitleText": "测试页",
"enablePullDownRefresh": false
}
}

