JavaScript 对象的生命周期和内存泄漏

2023-11-22

我对此进行了相当多的研究,但主要是通过将其他问题拼凑在一起,这仍然留下了一些疑问。在一个不随时刷新浏览器页面并且可能会运行相当长一段时间(几个小时)而不关闭的应用程序中(假设刷新页面或导航到另一个页面会重新启动 js 代码),确保对象的最佳方法是什么已释放并且没有内存泄漏。

这些是我关心的具体场景:

下面的所有代码都在揭示性模块模式内。

mycode = function(){}()

函数内的变量,我确信这个变量被 GC 收集得很好

function(){ var h = "ss";}

模块内的变量,当不再需要时应该 g = null 吗?

var g;
function(){ g = "dd";}

最后是 jqXHR 的生命周期:它返回后是否被清理?无论是否保留在函数或模块内,是否应该在所有情况下将其设置为 null 作为预防措施?

如果这样做,它返回后是否会被 GC 清理掉?:

function(){
   var x = $.get();
   x.done = ...;
   x.fail = ...;
}

这样做的时候怎么样,x返回后它也会被清理吗?:

var x;
function(){
   x = $.get();
   x.done = ...;
   x.fail = ...;
}

最后,有没有一种方法可以在不重新启动浏览器的情况下清理所有变量并重新启动模块?


函数内的变量,我确信这个变量被 GC 收集得很好

Yes.

模块内的变量,当不再需要时应该 g = null 吗?

Sure.

最后是 jqXHR 的生命周期:它返回后是否被清理?无论是否保留在函数或模块内,是否应该在所有情况下将其设置为 null 作为预防措施?

各种浏览器都存在与 XHR 相关的错误,导致onreadystatechange以及它关闭后仍然无法收集的任何东西,除非开发人员小心地将其替换为虚拟值(xhr.onreadystatechange = new Function(''))但我相信 jQuery 会为你处理这个问题。

最后,有没有一种方法可以在不重新启动浏览器的情况下清理所有变量并重新启动模块?

与页面关联的全局状态将占用浏览器内存,直到该页面从浏览器历史堆栈中逐出。location.replace可以在这里帮助您,让您终止当前页面并将其替换为同一应用程序的新版本,而无需扩展历史记录堆栈。

将当前文档替换为提供的 URL 处的文档。与的区别assign()方法是使用后replace()当前页面不会保存在会话历史记录中,这意味着用户将无法使用“后退”按钮导航到该页面。

当您使用“模块”一词时,该术语对于浏览器或其 JavaScript 解释器来说没有明确定义的含义,因此无法从内存中逐出模块,只能逐出模块。您必须担心以下几件事可能会将内容保留在内存中:

  1. 对附加到 DOM 节点的 JavaScript 对象及其关闭的所有内容的引用——事件处理程序是一个非常常见的示例。
  2. Live setInterval and setTimeout回调以及它们关闭的所有内容。
  3. 全局对象的属性以及它们所覆盖的所有内容。
  4. 正如您所指出的,某些主机对象的属性(例如 XHR 实例、Web Worker 回调等)以及(您猜对了)它们关闭的所有内容。

任何要卸载模块且仅卸载模块的方案都需要处理所有这些,并找出其中哪些是该模块的一部分,哪些不是。这是很多不同类型的清理工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 对象的生命周期和内存泄漏 的相关文章

  • 如何在codeigniter中将上传图片比例限制为16:9?

    这是我用来上传图像的代码 this gt load gt library upload ext pathinfo file name PATHINFO EXTENSION img name now ext imgConfig upload
  • 摩卡 - Chai Karma“套件未定义”

    我对 jscript tdd 很陌生 遇到了问题 希望有人能告诉我我在做什么 在浏览器中运行测试 通过 HTML 文件 一切正常 通过节点和业力运行它们我得到以下异常 我想在 node js 主机的 karma 中使用 Mocha 和 Ch
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • 引导程序提前输入未填充承诺的响应

    我的引导程序预输入如下
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • jQuery AJAX 请求在 IE8 中失败,并显示消息“错误:调用 open 方法之前无法调用此方法。”

    我正在使用 jQuery 1 4 2 并尝试执行一个简单的 AJAX 请求 目标 URL 返回一个 JSON 字符串 我使用 jslint 对其进行了验证 该请求在 Firefox 和 Chrome 中有效 但不想在 IE8 中工作 我无法
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • Chrome 扩展程序在代码中使用 client_secret

    我正在开发具有自己的 oAuth 授权的 Google Chrome 扩展 当然 我必须使用 client id 和 client secret 作为请求令牌 有什么办法可以向用户隐藏这些数据吗 由于此请求只是 javascript 源代码
  • jQuery:处理 getJSON() 中的错误?

    使用 jQuery 时如何处理 500 错误getJSON http api jquery com jQuery getJSON 有几个关于错误处理的问题getJSON and https stackoverflow com questio
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • Javascript - 水波纹效果

    我需要 JS 上的脚本 它将以 水波纹 样式更改 images html 抱歉 6MB GIF 文件 http fcuunited ru temp listening2 gif http fcunited ru temp listening
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro
  • 循环内的异步性

    我正在使用 jQuery getJSON 用于从一组实用程序的给定 URL 检索数据的 API 我真的很想找到一种为每个实用程序重用代码 完全相同 的方法 由于循环的执行与 ajax 调用无关 因此我无法找到保留循环值的方法 我知道这个描述

随机推荐

  • 如何在 Java 中将整数转换为本地化的月份名称?

    我得到一个整数 我需要转换为各种语言环境中的月份名称 区域设置 en us 的示例 1 gt 一月2 gt 二月 区域设置 es mx 的示例 1 gt 埃内罗2 gt 费布雷罗 import java text DateFormatSym
  • Jmeter 的 WebSocket 插件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有人可以与我分享 JMeter Websocket 协议插件采样器的链接吗 我尝试从下面的链接安装 https github com kawasim
  • 错误:管道损坏/MySQL 服务器已消失

    MySQL 抛出 Broken Pipe 和 MySQL Server has gone gone 错误 我的数据库表包含文本字段 我每隔 1 小时定期在其中插入大型 HTML 我应该考虑设置哪个 MySQL 变量 这是当前配置 mysql
  • C语言的unicode你好世界?

    我正在尝试从 C 输出 蠀 等内容 include
  • 启动和停止来自广播接收器的通知

    我正在尝试从广播接收器启动状态栏通知 然后从另一个广播接收器停止它 但我遇到了问题 我想在 USB 连接时在状态栏中启动通知 然后在 USB 断开连接时我想停止它 我设置了两个接收器并正在工作 只是在从接收器启动和停止一个接收器方面遇到困难
  • 如何从 DatePickerDialog 获取 DatePicker?

    我有一个活动弹出 android app DatePickerDialog DatePickerDialog dialog new DatePickerDialog this startDateSetListener start cal g
  • 固定页眉

    我以前从未处理过 CSS 但现在我必须处理 我正在开发一些 HTML 代码 一个网站的草图 并且有 CSS 问题 我希望我的标题位于固定位置 我的意思是它始终应该位于网站的顶部 即使有太多内容以至于网站必须滚动才能看到所有内容 我尝试过一些
  • 删除控制器/类中的 HttpServletRequest 参数的最佳方法?

    我有一个情况 我需要将 HTTP 请求对象重定向到其他控制器 类以进行进一步处理 问题是 在某些控制器中 我想更好地控制我转发到下一个类的参数 修改 编辑 删除它们 所以 我想知道是否有一个好的实践 模式来实现对 HTTP 请求参数的基本控
  • Android 4 ICS 上带有 SSL 客户端证书的 WebView

    我对 Android 上的本机 WebView 有问题 我需要使用 SSL 客户端证书对站点进行身份验证 Android WebView 似乎不支持这个 作为解决方法 我使用了 WebView 的修改版本 https github com
  • java中String转int数组

    我有一根绳子 String arr 1 2 ie 1 2 就像一个单一的字符串 我该如何转换这个arrjava中的int数组 String arr 1 2 String items arr replaceAll replaceAll rep
  • JavaScript 中的数字是不可变的吗? [复制]

    这个问题在这里已经有答案了 可能的重复 javascript 数字 不可变 我读了道格拉斯 克罗克福德 Douglas Crockford 的书 JavaScript the Good Parts 它说 JavaScript 中的数字是不可
  • 如何在不输入任何内容的情况下触发角度解析器

    正如主题所述 我如何触发在一个内部发生的动作 modelController parsers 没有用户输入 我能想到的唯一方法是将它们包装在函数中并调用它 但是有没有更好的方法来触发 pseudo modelController trigg
  • 对齐属性 已弃用

    不久前我发现中心标签已被弃用 这是可以理解的 因为 HTML 是用来构建内容的 而不是用来格式化的 但为什么对齐属性也被弃用了呢 属性可用于格式化 我明白CSS可以用 但并不是每个人都懂CSS 更糟糕的是 文本对齐 居中 and 左边距 自
  • 源代码不可用时的访问者模式实现

    考虑的原因之一访客模式 这种分离的实际结果是能够向现有对象结构添加新操作 而无需修改这些结构 假设您没有第三方库的源代码 并且您已经添加了对相关对象的一项操作 由于您没有对象 因此无法修改您的元素 第三方类 来添加访问者 在这种情况下 双重
  • 使用后备语言检索 i18n 数据

    我必须从数据库中获取 i18n 文本 默认语言为英语 其文本为一切 但非英语语言不一定具有所有所需的翻译 如果某个实体 键的非英语翻译在数据库中不可用 那么我希望它返回英语文本 所以 英语是fallback这里的语言 i18n 文本表如下所
  • 如何使用 CMake 有选择地链接到静态或动态 boost 库?

    我有一个 CMake 项目 有时想针对静态 boost 库进行编译 但我也希望能够轻松地使用 cmake GUI 中的动态库 在我的顶级 CMakeLists txt 中 我有以下内容 option USE STATIC BOOST Bui
  • jQuery 中的节流事件调用

    我有一个keyup事件绑定到需要大约四分之一秒才能完成的函数 search keyup function code that takes a little bit to complete 当用户键入整个单词或以其他方式快速按键时 该函数将连
  • 使用pyspark,在hadoop文件系统上读/写2D图像

    我希望能够在 hdfs 文件系统上读取 写入图像并利用 hdfs 局部性 我有一个图像集合 其中每个图像由以下内容组成 uint16 的二维数组 存储为 xml 文件的基本附加信息 我想通过 hdfs 文件系统创建一个存档 并使用 Spar
  • jQuery Mobile 破坏了我的网站

    当我仅使用移动触摸屏设备时 我会在网站上加载 jQuery Mobile 当我这么做的时候 它把一切都搞乱了 例如 选择菜单也不能正常工作 页面底部会出现 正在加载 正在加载 未定义 字样 我知道我错过了一些东西 但不知道是什么 关于我可能
  • JavaScript 对象的生命周期和内存泄漏

    我对此进行了相当多的研究 但主要是通过将其他问题拼凑在一起 这仍然留下了一些疑问 在一个不随时刷新浏览器页面并且可能会运行相当长一段时间 几个小时 而不关闭的应用程序中 假设刷新页面或导航到另一个页面会重新启动 js 代码 确保对象的最佳方