3.8.2 创建一个只有图片的项目打出android包内存会慢慢上涨

不封顶那种 挂一个晚上就能上涨1g 就是新建了一个工程里面放了两个label两个button
再android studio 里面profiler里面查看 Native会稳定增长

没有其他操作吗?没有切换场景,创建、销毁资源之类的操作吗?

如果只创建两个 label和button,理论上是静态的页面了,不应该出现持续增长不降的情况的。

没有的 甚至连脚本都没有
不确定是不是因为 sdk ndk gradle引起的

image

请问你是编译 debug 还是 release 版本?
性能、内存测试,尽量要用 release 版本验证。

另外, 可以用 Android Studio 的 Profile 功能定位一下是那部分的内存有增长,是 java heap,native,graphics 还是 unknown

1赞

debug版本 内存增长的是native 不会下降的
架构是 arm64-v8a armeabi-v7a x86

试试编译一个 release 版本 apk 看看。

image
image

我打了一个release包 然后这是就在界面上挂 内存在增长 才10分钟 native从22.x M增加到36.9M
没有脚本 运行没有报错

我们的测试环境是32位的雷电模拟器

那用真机验证看吧。不排除有可能是模拟器的问题。

测试过了 雷电模拟器4 雷电模拟器5 都是32位的 涨的是native增长速度比较快 真机会涨other涨的缓慢但还是上升
同样一个界面开着不动任何操作挂一小时

WebSocket好像也会让内存缓慢上涨

在 3.8.5 中修复,感谢反馈。

为啥这么加一句就好了,能不能告诉下我们,要知其然,也要知其所以然 :sweat_smile:

其实就是 jni 申请内存和释放内存要配对,否则就会导致泄露。

jbyte *array = env->GetByteArrayElements(static_cast<jbyteArray>(strongRef), &isCopy);
wsOkHttp3->onBinaryMessage(reinterpret_cast<uint8_t *>(array), len);
env->ReleaseByteArrayElements(static_cast<jbyteArray>(strongRef), array, JNI_ABORT);

GetByteArrayElements 和 ReleaseByteArrayElements 是一对。

3赞

原来如此 :+1:

这个 PR 中修复:

1赞

这个 PR 的问题是因为啥导致的,看着好像不是websocket的那个 :rofl:

两个不同的问题。
这个是跟结构体对齐编译器自动padding有关,在 x86 架构上会有问题导致 hash 计算异常,进而导致 unordered_map 被频繁添加不同的元素而导致的内存泄露问题。

3赞

:+1:原来如此,希望以后类似这种修复能稍稍的讲解下为啥,虽然不是很懂,但稍稍讲解下为啥,心里也能稍微有个数了 :joy:

请问一下,这个pr是不是只有abi 打x86的时候才有用,我们只打armv7 和 arm64的so,在模拟器上跑会不会出现对应泄露?
如果不会,我就不急着合并了。