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

16 回复

通过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返回,页面实例也不会立即被销毁,而是保留在页面栈中用于快速恢复。

内存上涨的主要原因:

  1. 页面实例未及时回收:nvue页面使用原生渲染,页面实例比vue页面更重,频繁跳转会导致多个页面实例同时存在于内存中
  2. 页面栈管理机制:uni-app默认会缓存一定数量的页面实例以优化性能
  3. 原生组件资源:nvue中的原生组件(如view、text等)会占用更多原生内存

解决方案:

  1. 使用redirectTo替代navigateTo
uni.redirectTo({
    url: '/pages/test/test'
})

redirectTo会关闭当前页面直接跳转,避免页面栈堆积。

  1. 手动管理页面生命周期: 在页面的onUnload生命周期中主动释放资源:
onUnload() {
    // 清理定时器、事件监听等
    this.timer && clearTimeout(this.timer)
}
  1. 调整页面缓存策略: 在pages.json中配置页面缓存:
{
    "path": "pages/test/test",
    "style": {
        "navigationBarTitleText": "测试页",
        "enablePullDownRefresh": false
    }
}
回到顶部