有没有办法控制Javascript何时执行垃圾收集?我想让它在某些时候执行垃圾收集,以确保我的网站顺利运行
我正在使用Chrome Dev Tools v27中的时间轴分析以下代码的内存使用情况.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='content-type' content='text/html; charset=UTF-8' />
<title>RAF</title>
</head>
<body>
<script type='text/javascript' charset='utf-8'>
var frame = function() {
window.webkitRequestAnimationFrame(frame);
};
window.webkitRequestAnimationFrame(frame);
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
注意这很简单.但最终我看到一个牙齿图案出现,表明垃圾收集器正在回收内存.

raf是否默认创建垃圾对象?有什么方法可以避免这种情况吗?谢谢.
javascript optimization garbage-collection memory-leaks requestanimationframe
目前正在致力于优化库的速度。我已经通过 Webstorm 使用V8 CPU 和内存分析大幅缩短了执行时间。这主要是通过将核心方法从递归改为迭代来实现的。
现在自我时间分布分解为
我假设第一个条目“节点”正在计时内部函数调用,这很棒。其他条目也有道理。我是 Nodejs 分析的新手,但 GC 的 31.6% 似乎很高,所以我决定进行调查。
我现在已经通过 Webstorm 创建了一个堆转储,但不幸的是,这并没有给我提供太多信息。
这些似乎主要是系统内部存储器引用。再次单步查看核心迭代代码逻辑,似乎也没有很多显式分配内存的地方(以此作为参考)。
问题
设置说明
如果有人想尝试调试这个,我将提供设置说明。
下载或克隆对象扫描并运行
yarn install --frozen-lockfile
yarn run test-simple --verbose
Run Code Online (Sandbox Code Playgroud)
test.js现在在项目根目录中创建一个包含此内容的文件,并运行node --trace_gc test.js或通过 Webstorm 运行它以进行高级分析。
我正在尝试在 Chrome 扩展程序中录制屏幕。为了做到这一点,我正在使用
navigator.webkitGetUserMedia(videoConstraints, function(stream) { ...
Run Code Online (Sandbox Code Playgroud)
作为 videoConstraints 我发送:
var videoConstraints = {
audio: false,
video: {
mandatory: { chromeMediaSource: 'screen', maxWidth: 960,
maxHeight: 720, minWidth:960, minHeight:720 },
optional: [
{ minFrameRate: 60 },
{ maxWidth: 640 },
{ maxHeigth: 480 }
]
}
};
Run Code Online (Sandbox Code Playgroud)
不幸的是,结果非常滞后。有没有办法用这种方法达到 60 FPS?还是我应该寻找其他选择?NaCl 会是一条路吗?
google-chrome google-chrome-extension webrtc screen-recording
我目前正在使用Javascript构建游戏.经过一些测试后,我开始注意到偶然的延迟,这只会是由GC引起的.我决定在它上面运行一个配置文件.结果表明GC实际上是罪魁祸首:
我读到创建新对象会导致很多GC.我想知道是否有这样的事情:
var x = [];
Run Code Online (Sandbox Code Playgroud)
也创建任何Garbage,因为Java中的原始类型不会这样做.由于Javascript中没有真正的类型,我不确定.此外,哪一个最适合创建最少量的垃圾:
选项1:
function do() {
var x = [];
...
}
Run Code Online (Sandbox Code Playgroud)
选项2:
var x = [];
function do() {
x = [];
...
}
Run Code Online (Sandbox Code Playgroud)
选项3:
function do() {
x = [];
...
}
Run Code Online (Sandbox Code Playgroud)
或选项4:
function do() {
var x = [];
...
delete x;
}
Run Code Online (Sandbox Code Playgroud)
选项5:
var x = [];
function do() {
x.length = 0;
...
}
Run Code Online (Sandbox Code Playgroud)
在我的案例中,do函数被称为30次/秒.它在阵列上运行几个操作.
我想知道这一点,因为我只是将我的所有变量全局化以试图阻止它们被GC收集,但GC没有太大变化.
您是否也可以提供一些常见的例子来说明会产生大量垃圾和一些替代品.
谢谢.
查找内存泄漏是一项非常困难的任务,尤其是在涉及使用许多第三方库的现代 JS 代码时。
例如,我目前在 rollup 中面临内存泄漏,涉及 babel 和自定义 babel 插件。
我正在探索几种常见的策略来追捕它们:
node --heap-prof node_modules/rollup/dist/bin/rollup -c分析汇总构建)。然后在 Chrome Dev Tools 中打开它,通过Memory-> Load。最后一个问题也是我在这里的问题:我们如何分析 Node(或一般的 V8)中的对象分配树?我怎样才能找出我在步骤 (2) 中识别的对象在哪里踢?
通常,这个问题的答案会告诉我们在哪里更改代码以阻止泄漏。(当然,如果您的问题是内存流失,而不是内存泄漏,那么这个问题可能不是那么重要。)
在我的例子中,我知道内存被 Babel …