gpt4 book ai didi

javascript - 垃圾收集如何处理 mobx-utils 中的异步操作?

转载 作者:行者123 更新时间:2023-12-03 03:42:34 28 4
gpt4 key购买 nike

我想要一个清晰的方法来创建商店,当我知道有新的服务数据可用时,我可以刷新该商店(例如 mobx-utils 中的 lazyObservable),但可以轻松附加更多数据计算值和 Action 函数。

从create-react-app开始,使用这个index.js

import React from 'react';
import ReactDOM from 'react-dom';
import {observable} from 'mobx';
import {observer} from 'mobx-react';
import {asyncAction} from 'mobx-utils';

const flipACoin = () => Math.random() > 0.5;

function determineGodliness() {
const screwYourRAM = new Array(1000000).fill(Math.random());

return new Promise((resolve) => {
setTimeout(() => {
resolve([flipACoin(), flipACoin()]);
}, 1500);
});
}

function godStore() {
const store = observable({
alpha: false,
omega: false,
waiting: false,
refresh: asyncAction(function *() {
this.waiting = true;
[this.alpha, this.omega] = yield determineGodliness();
this.waiting = false;
}),
get isGod() {
return this.alpha && this.omega;
}
});

store.refresh();

return store;
}

window.store = godStore();

const App = observer(({store}) => <p>{
(store.waiting)
? 'The suspense is killing me!'
: (store.isGod)
? 'I am the Alpha and the Omega'
: 'I just work here.'
}</p>);

ReactDOM.render(<App store={window.store} />, document.getElementById('root'));

每次在控制台中运行 window.store.refresh() 时,任务管理器都会显示内存使用量增加。有趣的是,使用 setInterval(window.store.refresh, 3000) 实际上会导致内存使用量振荡而不是线性攀升。在这两种相互冲突的情况之间,我对垃圾收集器如何看待此设置感到困惑。

我该怎么做才能绝对确保 screwYourRAM 最终会被垃圾收集?我关心的只是保留从生成器返回的内容,而不是临时分配的内容。

最佳答案

仅通过查看内存图很难确定内存泄漏。 Afaik V8 不会总是释放所有内存,除非确实存在短缺(GC-ing 毕竟是一种优化,过于积极的收集会节省内存,但会消耗太多 CPU 周期。你不能假设一个空闲的 VM 会自动释放所有内存)。因此,我通常使用节点脚本来测试它,该脚本会长时间运行并重复一个过程,并使用有限的内存来查看是否确实存在泄漏。

在您的示例中,据我所知/可以告诉,没有理由会发生内存泄漏。在某些时候,Promise 会被 gc 化,从而可以 gc 随之而来的闭包。 Chrome 控制台将通过 $_ 保留对您的 promise 的引用,以便这也可以解释内存的增加)

要正确查看是否存在内存泄漏,请使用 chrome/firefox 中的分析器,并确保强制执行 GC(chrome devtools 有一个按钮,FF 也可能如此)

关于javascript - 垃圾收集如何处理 mobx-utils 中的异步操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45556604/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com