BillZhang2023
BillZhang2023
我们11.8版本也遇到v8_enable_pointer_compression=true v8_enable_sandbox=false下,挂机指针压缩表的内存会泄露,10小时1个GB的水平(iOS 6GB)。查了代码就是 ExternalPointerTable里的SweepAndCompact调用必现打开 V8_ENABLE_SANDBOX宏。 关闭 v8_enable_pointer_compression V8内存泄露问题解决,但基础内存增加不少。 我们尝试打开这两个宏,构建的版本会到了登录页面自动Crash(4/4),没有Crash堆栈上报,日志也没有体现,内存才600MB占用,看Perfdog像是 上下文切换过多导致。
你那里的提示,说明打开沙盒宏的时候,需要在v8构建参数里指定 array_buffer_allocator 为ArrayBuffer::Allocator v8::Isolate::CreateParams CreateParams; static v8::ArrayBuffer::Allocator* DefaultAllocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); CreateParams.array_buffer_allocator = DefaultAllocator; 再看了一下V8的源码,发现不打开沙盒宏的时候,ArrayBuffer::Allocator::NewDefaultAllocator的分配是系统分配,所以打开指针压缩宏(不打开沙盒宏),这个指定分配器代码也没有效果
> > 你那里的提示,说明打开沙盒宏的时候,需要在v8构建参数里指定 array_buffer_allocator 为ArrayBuffer::Allocator v8::Isolate::CreateParams CreateParams; static v8::ArrayBuffer::Allocator* DefaultAllocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); CreateParams.array_buffer_allocator = DefaultAllocator; > > 再看了一下V8的源码,发现不打开沙盒宏的时候,ArrayBuffer::Allocator::NewDefaultAllocator的分配是系统分配,所以打开指针压缩宏(不打开沙盒宏),这个指定分配器代码也没有效果 > > 是的,按源码来看,指针压缩还是得配套沙盒宏一起开。后续你们方案是如何 打开沙盒就必须不能使用外部分配的指针,我们项目里有部分外部指针,现在是去除了BindStruct里的ArrayBuffer优化,目的是尽量减少外部指针的量,保留打开指针压缩宏,关闭沙盒宏的配置,如果后续测试验证泄露速率足够低的话,就这样,如果不行就放弃指针压缩。 在指针压缩宏打开情况下,TS代码里创建ArrayBuffer,同样会导致上述的外部指针表泄露。 结论就是想完全不泄露,这两个宏要同时打开/关闭。 只打开指针压缩宏,就必须控制每帧ArrayBuffer New的数量足够低