Qt之qml内存泄漏解决方案

1 qml或js内存方法的分析
      qml和js的内存分析一般使用gammray或者qmlprofiler进行分析,但是目前这两个工具运行起来都有各自的局限性。 

1.1 qml和js持续的内存消耗
      qml和js在Qt5中的内存管理是非常复杂的,且qml和js的原则是不关心内存的使用,并且qml和js本身是一个内存怪兽而且管理的方式和C++也是截然不同。 qml和js在创建和销毁component的方式与js的内存管理一致,都是通过gc进行管理,而Qt针对这块的内存也是lazy的方式进行gc,因为gc本身也有成本。所以qml和js在内存这块无法做到创建了一个页面,当页面销毁的时候就回收内存。
     Qt内存在管理QObject QQuickItem这种对象的时候,都是通过父子管理进行管理,也就是当父亲对象销毁的时候,同时会销毁子对象,所以Qt的内存管理比较简单。但是这个策略本身也产生了一定的问题,因为只有父对象销毁的时候,子对象才会被销毁,在使用的过程中就会导致内存使用量偏高。
      在qml侧的ListView是最明显的一个场景, delegate会自动的创建ListView显示的条目,这些条目的父对象应该是ListView的 contentItem,所以就导致条目很难被回收内存, 所以在整个内存优化的时候需要重点考虑ListView的优化。 
1.2  qml和Js内存优化的方案
       如下是经测试可以减少内存使用的方案。
(1)动态的创建和销毁组件,比如使用loader的方案;
(2)通过trim的方法减少qmlengine的cache,减少程序的峰值;
(3) 支持qtquickcompiler加速程序的启动速度和内存使用;
(4) 减少QQuickView的使用,可以支持在App中支持多页面管理(也包括toast)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值