首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >垃圾收集如何解决mobx-utils中的异步操作?

垃圾收集如何解决mobx-utils中的异步操作?
EN

Stack Overflow用户
提问于 2017-08-08 06:27:43
回答 1查看 687关注 0票数 0

我想要一个清晰的方法来创建存储,当我知道有新的服务数据可用时,我可以刷新这些存储(比如来自mobx-utilslazyObservable ),但可以轻松地附加更多的计算值和操作函数。

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

代码语言:javascript
复制
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最终会被垃圾回收?我所关心的是保存从生成器返回的内容,而不是在此期间分配的内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-12 03:36:35

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

在您的示例中,据我所知/可以断定,没有理由会有内存泄漏。在某种程度上,这个承诺是gc-ed的,这使得它可以gc随之而来的闭包。chrome控制台将通过$_遵守您的承诺,因此这也可以解释内存增加的原因。)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45556604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档