Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 反应本机+;Redux+;ImmutableJS内存泄漏_Ios_React Native_Memory Leaks_Redux_Immutable.js - Fatal编程技术网

Ios 反应本机+;Redux+;ImmutableJS内存泄漏

Ios 反应本机+;Redux+;ImmutableJS内存泄漏,ios,react-native,memory-leaks,redux,immutable.js,Ios,React Native,Memory Leaks,Redux,Immutable.js,我的React原生应用程序中有一个奇怪的内存泄漏。这是一个持续的RAM增加。 我的状态被规范化,然后转换为不可变状态。有一个套接字处理程序更新状态中的现有对象。这会导致RAM随着新消息更新状态而缓慢增加 状态: const state = { entities: { 2000: { 1: { id: 1, name: "I am normalized",

我的React原生应用程序中有一个奇怪的内存泄漏。这是一个持续的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
传递给一个减速机

action = {
    payload: {
        message_type: COORDINATES_UPDATE,
        messages: [
            {
                id: 1,
                coordinates: [
                    {
                        lat: 180,
                        lng: 180
                    }
                ]
            },
            {
                id: 2,
                coordinates: [
                    {
                        lat: 90,
                        lng: 90
                    }
                ]
            }
        ]
    }
}
处理传入操作的减速器

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;
    }
}
这将在
结果
映射()
中搜索现有的
id
,如果它确实存在,则会更新实体对象。据我所知,此逻辑没有问题,状态正确更新并反映在
render()
组件中,尽管出于调试目的,我将一个空的
呈现为我的整个应用程序,并且只更新状态

然而,每次
setIn
updateIn
都会略微增加RAM,并且随着更新频率的增加,它会在几分钟内增长到GB

相关套餐:

"react": "16.0.0",
"react-native": "0.50.3",
"immutable": "^3.8.2",
"normalizr": "^3.2.4",
"redux": "^3.7.2",
哦,那是一个很大的;) 您可能应该检查两件事:

0)您有多少个插座连接?你可能有5-10,所有的数据都会成倍增加


1) 你使用redux开发工具吗?在您的情况下,它可能消耗非常大的内存,考虑停用生产/测试

< P> Normalizr最初是为浏览器开发的。实体的内存消耗问题是众所周知的,然而,实际上它并没有被视为一个障碍,因为浏览器上的页面生命周期足够短

同时,在本机应用程序中,必须正确释放内存。不幸的是,目前还没有优雅的库或解决方案。作为折衷方案:

  • 不要使用normalizer。自己更新每个实体
  • B.自己在实体上实现垃圾收集

我最终尝试了许多不同的解决方案,从这个线程和github,但最耗时(和悲哀的)一个工作得最好。取出ImmutableJS

在我用lodash函数替换它之后,内存稳定了下来

const newState = state; //just because i don't want to mutate state
let updates = {}; //put my updates here
return _.merge({}, newState, updates); //merge into an empty object
reselect
希望每次状态发生变化时都有一个新对象,我有一个非常嵌套的状态结构。因此我选择了
.merge({},…)
而不是
.assign


仍然有一个非常轻微的增加,但这比过去要好得多。

您必须检查每个循环中的项和子项是否使用新实例创建。0)1持久连接;1) 是的,我试过把它关掉。内存使用率仍然较低;它似乎是由immutable创建的中间映射,我对更新代码进行了更多的优化,但在一个小时内,它仍然会占用几GB的内存。您确定只需要向映射“实体”(即“结果”映射的键)添加键,这一逻辑正确吗?您不应该创建这么多不可变的结构,而是将更改作为一个大的更新来执行,但是,我仍然认为您不会因为这段代码而出现内存泄漏,如果逻辑正确,我可以帮助您进行更新。内容是字典,而结果是索引;我正在更新字典的一部分。套接字更新与一些字典更新一起成批出现,我必须使用索引在多个字典中找到它们。感谢这些信息,我将通过拿出您的发现来测试这一点。我也对您的发现非常感兴趣,因为我在工作中也面临着同样的问题。我期待着你的报告。我最后把诺曼蒂尔带走了;取而代之的是重新设计它的功能(我需要这种结构),但不幸的是它没有帮助。