• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - React-Native + Redux + ImmutableJS 内存泄漏

[复制链接]
菜鸟教程小白 发表于 2022-12-13 03:56:26 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我的 React-Native 应用程序中有一个奇怪的内存泄漏。这是一个不断增加的 RAM。 我的状态被规范化,然后转换为不可变状态。有一个套接字处理程序可以更新状态中的现有对象。这会导致 RAM 在新消息更新状态时缓慢增加。

状态:

const state = {
    entities: {
        2000: {
            1: {
                id: 1,
                name: "I am normalized",
                coordinates:[
                    {
                        lat: 0,
                        lng: 0
                    }
                ]
            },
            2: {
                id: 2,
                name: "me too",
                coordinates:[
                    {
                        lat: 0,
                        lng: 0
                    }
                ]
            }
        },
        1337: {
            2: {
                id: 2,
                name: "me too",
                coordinates:[
                    {
                        lat: 0,
                        lng: 0
                    }
                ]
            },
            3: {
                id: 3,
                name: "also normalized",
                coordinates:[
                    {
                        lat: 0,
                        lng: 0
                    }
                ]
            }
        }
    },
    results: {
        2000: [1,2],
        1337: [2,3]
    },
};

然后使用 fromJS() 将其转换为不可变状态。

我有一个套接字处理程序,它将 action.payload 传递给 reducer 。

action = {
    payload: {
        message_type: COORDINATES_UPDATE,
        messages: [
            {
                id: 1,
                coordinates: [
                    {
                        lat: 180,
                        lng: 180
                    }
                ]
            },
            {
                id: 2,
                coordinates: [
                    {
                        lat: 90,
                        lng: 90
                    }
                ]
            }
        ]
    }
}

处理传入 Action 的reducer:

case SOCKET_MESSAGE: {
    let newState = state;
    if(action.payload.message_type == "COORDINATES_UPDATE") {
        action.payload.messages.map((incoming_message) => {
            let id = incoming_message.id;
            let coordinates = incoming_message.coordinates;
            newState.get("results").map((data, entities_id) => {
                if(data.indexOf(id) > -1) {
                    newState = newState.setIn(["entities", entities_id, "" + id, "coordinates"], fromJS(coordinates));
                }
            })
        })
        return newState;
    }
}

这会在 results Map() 中搜索现有的 id,如果确实存在,它会更新实体对象。据我所知,这个逻辑没有问题,状态正确更新并反射(reflect)在 render() 组件中,尽管出于调试目的,我正在渲染一个空的 作为我的整个应用程序,并且只更新状态。

但是,每个 setInupdateIn 都会略微增加 RAM,并且随着更新频率的增加,我得到的内存会在几分钟内增长到 GB。

Steady RAM increase

相关包:

"react": "16.0.0",
"react-native": "0.50.3",
"immutable": "^3.8.2",
"normalizr": "^3.2.4",
"redux": "^3.7.2",



Best Answer-推荐答案


哦,那是一个巨大的;) 您可能应该检查两件事:

0) 你有多少个套接字连接?您可能有 5-10 个,所有数据都相乘

1) 你使用 redux-dev-tool 吗?在您的情况下,它可能会消耗大量内存,请考虑停用以进行生产/测试

关于ios - React-Native + Redux + ImmutableJS 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48574113/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap