在JS浏览器中重新使用分配的内存?

我知道内存的分配和释放是由浏览器控制的,但在JavaScript中,分配的内存是否可以被程序化地重复使用?

例如,假设一个函数(getData)属性(data)被用来存储indexedDB的结果。getAll 请求,因为(我知道你不会写这样的代码)。

getData.data = objectStore.getAll( keyRange ).result;

以后能否再调用 getData 重新使用从上一次调用中已经分配的内存,还是浏览器将始终分配一个新的内存区域来保存结果,并只指向 getData.data 到它,之后再释放保存之前结果的内存?

谢谢您。

问这个问题的一个原因是来自于观察我的应用程序中的内存使用情况。在一个用户会话中,这个getData类型的函数可能会被调用几百次,就像现在这样,所消耗的内存不断增加,直到达到一定的程度,然后再释放。我意识到GC应该是这样工作的,但是如果已经分配的内存能够被重新使用,那么应用程序就永远不需要在任何一个点上消耗那么多的RAM了。

我认为没有办法实现我所考虑的,因为indexedDB在从对象存储中检索对象时,总是会分配内存。在 getAll 请求将返回一个请求对象,其结果将是一个对象数组,即使可以将该结果写入一个已经存在的数组或对象,也不会有任何收获。我所有的代码其实只是引用或指向请求的结果;而暂时增加的RAM使用量将一直持续到GC运行为止,因为数据库请求不能从它的 “创建 “开始就直接写到内存的某个特定区域,所以可以这么说。在对象池或其他任何方法可以尝试之前,请求对象,包括结果,将存在于RAM的某个地方。

我在评论中提到的测试是不切实际的,是由500次调用的 getData 每次调用只隔了500ms,而且每次调用中检索到的数据远远大于预期使用下的应用。所以,在GC运行之前,RAM的使用量有时间大幅增加。在500次调用依次处理的过程中,RAM的使用量起起落落了好几次,我想,每一次发作,都是GC的一次运转。我喜欢对象池文章中的平坦的RAM使用图 此处 尽量减少GC运行;但在使用indexedDB时似乎无法实现。

解决方案:

在JavaScript中,分配的内存可以被程序化地重复使用吗?

是的,通过 对象池. 然而,这几乎是不合理的,原生分配器garbage collector在99%的情况下会优于这种方法。

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何在ionic框架中安装angularfire?

2022-9-9 9:43:17

未分类

我不明白为什么 "调用未定义的方法CI_Input()::event() "会被抛出。

2022-9-9 9:43:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索