Javascript force GC collection? / Forcefully free object?(Javascript强制GC收集?/强制释放对象?)
问题描述
我有一个 js 函数,用于使用音频接口播放任何给定的声音(为每个调用创建一个新实例).
I have a js function for playing any given sound using the Audio interface (creating a new instance for every call).
这工作得很好,直到大约第 32 次调用(有时更少).此问题与 Audio 实例的发布直接相关.我知道这一点是因为我已经让 Chromium 中的 GC 有时间运行,它可以让我再次播放另外 32 种左右的声音.
This works quite well, until about the 32nd call (sometimes less). This issue is directly related to the release of the Audio instance. I know this because I've allowed time for the GC in Chromium to run and it will allow me to play another 32 or so sounds again.
这是我正在做的一个例子:
Here's an example of what I'm doing:
<html><head>
<script type="text/javascript">
function playSound(url) {
var snd = new Audio(url);
snd.play();
snd = null;
}
</script>
</head>
<body>
<a href="#" onclick="playSound('blah.mp3');">Play sound</a>
</body></html>
我也有这个,它适用于少于 32 个 playSound 调用的页面:
I also have this, which works well for pages that have less than 32 playSound calls:
var AudioPlayer = {
cache: {},
play: function(url) {
if (!AudioPlayer.cache[url])
AudioPlayer.cache[url] = new Audio(url);
AudioPlayer.cache[url].play();
}
};
但这不适用于我想做的事情(用其他内容(来自单独的文件)动态替换 div,这些内容有更多的声音 - 1. 内存使用量很容易飙升,2. 很多声音永远不会玩).
But this will not work for what I want to do (dynamically replace a div with other content (from separate files), which have even more sounds on them - 1. memory usage would easily skyrocket, 2. many sounds will never play).
我需要一种立即释放声音的方法.是否有可能做到这一点?我没有找到音频接口的免费/关闭/卸载方法.
I need a way to release the sound immediately. Is it possible to do this? I have found no free/close/unload method for the Audio interface.
页面将在本地查看,因此声音的持续加载根本不是一个重要因素(而且大多数声音都很短).
The pages will be viewed locally, so the constant loading of sounds is not a big factor at all (and most sounds are rather short).
推荐答案
这不是一个详尽的答案,而是针对有没有办法强制chrome js引擎进行垃圾收集?"的问题,一个 chromium.org 的人回复了:
This is not an exhaustive answer, but to the question "Is there any way to force the chrome js engine to do garbage collection?", a chromium.org guy replied:
一般来说,不,设计使然. 出于测试目的,您可以通过一个标志在命令行上启用 javascript 命令window.gc()"强制垃圾收集.
In general, no, by design. For testing purposes there is a flag you can pass on the command line to enable a javascript command "window.gc()" to force garbage collection.
--js-flags '--expose_gc'
<小时>
更新:但是,正如@plash 在下面的评论中指出的那样,此标志将仅适用于调试版本.
UPDATE: However, as @plash noted in a comment below, this flag will only work in debug builds.
这篇关于Javascript强制GC收集?/强制释放对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Javascript强制GC收集?/强制释放对象?
基础教程推荐
- Vue 3 – <过渡>渲染不能动画的非元素根节点 2022-01-01
- Electron 将 Node.js 和 Chromium 上下文结合起来意味着 2022-01-01
- html表格如何通过更改悬停边框来突出显示列? 2022-01-01
- 如何使用TypeScrip将固定承诺数组中的项设置为可选 2022-01-01
- Chart.js 在线性图表上拖动点 2022-01-01
- 我可以在浏览器中与Babel一起使用ES模块,而不捆绑我的代码吗? 2022-01-01
- 如何使用JIT在顺风css中使用布局变体? 2022-01-01
- 用于 Twitter 小部件宽度的 HTML/CSS 2022-01-01
- 直接将值设置为滑块 2022-01-01
- 自定义 XMLHttpRequest.prototype.open 2022-01-01