[3.8.1]安卓遇到无法释放内存的问题及目前解决方法

多谢!!重新导出工程就好了

有办法自己设置gc的策略吗? 现在是一直不gc,内存一直涨

你确定强制 sys.garbageCollect() 也无法让内存降吗?

出现这种情况,有几个原因:

  1. JS 对象还被持有
  2. 如果是原生上的问题,那么 C++ 层中可能持有或者 root 了 JS 对象,导致 JS 对象没有被 GC

所以,你先确认一下 web 上内存是否能正常,再排查 原生上的行为,如果有自己写的 jsb 绑定代码,重点排查一下是否有哪些 jsb 对象 (se::Object*) 被持有并且 root 了。

如果你怀疑是引擎的问题,那么能提供一个最小的复现方式是最好的。

如果无法提供复现方式,想自己排查,通过 windows(visual studio)、mac (xcode allocation profile) 工具来辅助排查,应该会有一些线索。

感谢回复,主动sys.garbageCollect() 可以让内存下降,但如果不主动调用的话,要等比较久才下来,有设置gc策略的接口吗。

目前没有暴露 gc 调节的接口到 js 层。
其实 V8 默认的 GC 策略应该是最优的,有垃圾对象回收也是比较及时的。

确认一下

  1. web 上是否也出现这种回收比较慢的情况。
  2. 如果不调动 sys.garbageCollect(),大概过多久能够降下来?

sys.garableCollect() 属于全量 GC 操作,会比较耗时,只建议在切换场景的时候调用,游戏过程中是不建议调用的。

re 1. web 上是否也出现这种回收比较慢的情况。


刚刚在web上试了一下,上图是js堆的情况

re 2. 如果不调动 sys.garbageCollect(),大概过多久能够降下来?


同样的业务场景,跑了多次,差不多都是这么个曲线,17分钟的时候出现明显下降

android 上,是用真机测试的吗?

3.8.4 中有修复了若干内存泄露的问题:

  1. x86模拟器导致的内存泄露
  1. websocket 接收 二进制 数据导致的 jni 泄露
  1. label 是 none 模式下,频繁改变文本内容导致的泄露

你可以挨个合并一下改动,再确认一下是否还会出现。

感谢!是真机测试的