相关疑难解决方法(0)

Javascript和垃圾收集

有没有办法控制Javascript何时执行垃圾收集?我想让它在某些时候执行垃圾收集,以确保我的网站顺利运行

javascript garbage-collection

44
推荐指数
2
解决办法
3万
查看次数

requestAnimationFrame垃圾回收

我正在使用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)

注意这很简单.但最终我看到一个牙齿图案出现,表明垃圾收集器正在回收内存.

Chrome开发工具时间轴

raf是否默认创建垃圾对象?有什么方法可以避免这种情况吗?谢谢.

javascript optimization garbage-collection memory-leaks requestanimationframe

25
推荐指数
2
解决办法
3478
查看次数

GC 占用了预期运行时间的 32%?

目前正在致力于优化库的速度。我已经通过 Webstorm 使用V8 CPU 和内存分析大幅缩短了执行时间。这主要是通过将核心方法从递归改为迭代来实现的。

现在自我时间分布分解为

在此输入图像描述

我假设第一个条目“节点”正在计时内部函数调用,这很棒。其他条目也有道理。我是 Nodejs 分析的新手,但 GC 的 31.6% 似乎很高,所以我决定进行调查。

我现在已经通过 Webstorm 创建了一个堆转储,但不幸的是,这并没有给我提供太多信息。

在此输入图像描述

这些似乎主要是系统内部存储器引用。再次单步查看核心迭代代码逻辑,似乎也没有很多显式分配内存的地方(以此作为参考)。

问题

  • GC开销可以减少吗?
  • 这个分配量是预期的吗?
  • 是否可以获得更好的内存分析信息?

设置说明

如果有人想尝试调试这个,我将提供设置说明。

下载或克隆对象扫描并运行

yarn install --frozen-lockfile
yarn run test-simple --verbose
Run Code Online (Sandbox Code Playgroud)

test.js现在在项目根目录中创建一个包含此内容的文件,并运行node --trace_gc test.js或通过 Webstorm 运行它以进行高级分析。

optimization profiling garbage-collection node.js

7
推荐指数
1
解决办法
6065
查看次数

在 Chrome 中录制屏幕时如何达到 60 FPS?

我正在尝试在 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

5
推荐指数
1
解决办法
3851
查看次数

Javascript垃圾收集.创建对象和变量?

我目前正在使用Javascript构建游戏.经过一些测试后,我开始注意到偶然的延迟,这只会是由GC引起的.我决定在它上面运行一个配置文件.结果表明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没有太大变化.

您是否也可以提供一些常见的例子来说明会产生大量垃圾和一些替代品.

谢谢.

javascript garbage-collection

5
推荐指数
1
解决办法
353
查看次数

Node.js 中的内存泄漏 - 如何分析分配树/根?

查找内存泄漏是一项非常困难的任务,尤其是在涉及使用许多第三方库的现代 JS 代码时。

例如,我目前在 rollup 中面临内存泄漏,涉及 babel 和自定义 babel 插件。

我正在探索几种常见的策略来追捕它们:

  1. 了解您的运行时及其内存取消分配方案,并遵循有关该方案的最佳实践。
    • 本文声称所有现代 JS 运行时实现都使用标记和清除垃圾收集器。它的主要优势之一是它可以正确处理循环引用。(这篇文章还链接了这篇非常过时的研讨会论文。不要太在意它,因为它都是关于循环引用的,这应该不再是问题了。)
    • 这篇文章深入探讨了 V8 内存管理(注意:Node 和 Chrome 都基于 V8)。
  2. 如果您发现内存或 GC 使用量超出您的预期,请分析您的堆内存配置文件以找出内存分配的位置。
    • 这个 SO answer解释了如何在 Chrome 中做到这一点,但它的链接已经过时了。是指向相关 Chrome 文档的直接链接(截至 2021 年)。
    • 对于Node,我发现了很多过时的信息。目前,分析堆内存配置文件的最简单方法似乎是使用实验性的--heap-prof命令行参数(例如node --heap-prof node_modules/rollup/dist/bin/rollup -c分析汇总构建)。然后在 Chrome Dev Tools 中打开它,通过Memory-> Load
    • 分析后,我们可以了解大部分内存是在哪里/如何分配的;但一个关键问题尚未得到解答:
  3. 既然你知道谁是罪魁祸首(记忆猪),你怎么能找出他们为什么/在哪里仍然挥之不去?而且,更重要的是:内存占用对象的 GC 根(堆栈指针)是什么?

最后一个问题也是我在这里的问题:我们如何分析 Node(或一般的 V8)中的对象分配树?我怎样才能找出我在步骤 (2) 中识别的对象在哪里踢?

通常,这个问题的答案会告诉我们在哪里更改代码以阻止泄漏。(当然,如果您的问题是内存流失,而不是内存泄漏,那么这个问题可能不是那么重要。)

在我的例子中,我知道内存被 Babel …

javascript profiling memory-leaks v8 node.js

5
推荐指数
1
解决办法
511
查看次数