问题标签 [memory-management]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 必须在 C# 中手动清理的资源?
在C#中必须手动清理哪些资源,不这样做的后果是什么?
例如,假设我有以下代码:
如果我不使用 dispose 方法清理画笔,我假设垃圾收集器会释放程序终止时使用的内存?它是否正确?
我还需要手动清理哪些其他资源?
linux - 一种确定进程“真实”内存使用情况的方法,即私有脏 RSS?
'ps' 和 'top' 之类的工具会报告各种内存使用情况,例如 VM 大小和驻留集大小。但是,这些都不是“真正的”内存使用:
- 程序代码在同一程序的多个实例之间共享。
- 共享库程序代码在使用该库的所有进程之间共享。
- 一些应用程序分叉进程并与它们共享内存(例如,通过共享内存段)。
- 虚拟内存系统使 VM 大小报告几乎毫无用处。
- 当进程被换出时,RSS 为 0,因此它不是很有用。
- 等等等等。
我发现 Linux 报告的私有脏 RSS 是最接近“真实”内存使用的东西。这可以通过将 中的所有Private_Dirty
值相加来获得/proc/somepid/smaps
。
但是,其他操作系统是否提供类似的功能?如果没有,有什么替代方案?特别是,我对 FreeBSD 和 OS X 很感兴趣。
.net - 使用 GC.Collect() 有什么问题?
尽管我确实理解使用此功能的严重影响(或者至少我是这么认为的),但我不明白为什么它会成为受人尊敬的程序员永远不会使用的东西之一,即使是那些甚至不知道的人它是干什么用的。
假设我正在开发一个应用程序,其中内存使用量根据用户的操作而变化很大。应用程序生命周期可以分为两个主要阶段:编辑和实时处理。在编辑阶段,假设创建了数十亿甚至数万亿个对象;其中有些很小,有些没有,有些可能有终结器,有些可能没有,假设它们的生命周期从几毫秒到几小时不等。接下来,用户决定切换到实时阶段。在这一点上,假设性能起着根本性的作用,并且程序流程中最轻微的改变都可能带来灾难性的后果。然后通过使用对象池等将对象创建减少到最低限度,但随后,GC 意外地插入并将其全部丢弃,并且有人死了。
问题:在这种情况下,在进入第二阶段之前调用 GC.Collect() 不是明智的吗?
毕竟,这两个阶段永远不会在时间上相互重叠,GC 可能收集的所有优化和统计信息在这里用处不大......
注意:正如你们中的一些人所指出的,.NET 可能不是这样的应用程序的最佳平台,但这超出了这个问题的范围。目的是澄清 GC.Collect() 调用是否可以改善应用程序的整体行为/性能。我们都同意你会做这样的事情的情况非常罕见,但话又说回来,GC 试图猜测并且大部分时间都做得很好,但它仍然是猜测。
谢谢。
python - Python中的短整数
Python 根据底层系统架构自动分配整数。不幸的是,我有一个巨大的数据集,需要完全加载到内存中。
那么,有没有办法强制 Python 只对某些整数使用 2 个字节(相当于 C++ 'short')?
c++ - 减少大型不熟悉代码库的内存占用
假设您有一个相当大(~2.2 MLOC)、相当老(10 多年前开始)C/C++ 的 Windows 桌面应用程序。大约 10% 的模块是外部的,没有源代码,只有调试符号。
您将如何将应用程序的内存占用减少一半?至少,你会怎么做才能找出内存消耗的地方?
database - 如何避免使用 LINQ-To-SQL 的内存泄漏?
我在使用 LINQ-To-SQL 时遇到了一些关于内存使用的问题。我在 Windows 服务中使用它来进行一些处理,并且我正在循环访问从上下文中拉回的大量数据。是的 - 我知道我可以使用存储过程来做到这一点,但有一些原因表明这不是一个理想的解决方案。
无论如何,我看到的基本上是即使在我调用之后内存也没有被释放context.SubmitChanges()
。所以我最终不得不做各种奇怪的事情,比如一次只拉回 100 条记录,或者创建多个上下文并让它们都执行单独的任务。如果我保持相同DataContext
并稍后将其用于其他调用,它只会占用越来越多的内存。即使我调用查询返回给我Clear()
的 " " 数组,将其设置为 null,然后调用- 它仍然不会释放内存。var tableRows
SYstem.GC.Collect()
现在我已经阅读了一些关于如何快速使用DataContexts
并快速处理它们的内容,但似乎它们应该是一种强制上下文转储其所有数据(或特定表的所有跟踪数据)的方法一定要保证内存是空闲的。
任何人都知道哪些步骤可以保证内存被释放?
c# - .NET + 复制大量内存技巧
早在过去,就曾使用过一些技巧(通常用于块外帧缓冲区),将大块内存从一个位置复制到另一个位置。
现在我正在使用 C# 工作,我发现需要每秒大约 60 次将字节数组(大小约为 32k)从一个内存位置移动到另一个内存位置。
不知何故,我不认为 for 循环中的逐字节复制在这里是最佳的。
有谁知道在仍然停留在纯托管代码中的同时做这种工作的好技巧?
如果没有,我愿意做一些 P/Invoking 或进入不安全模式,但如果可以的话,出于跨平台的原因,我想保持管理。
编辑:我写的一些基准代码只是为了好玩:
逐字节:15.6192
每个循环 4 字节:15.6192
块复制:0
optimization - 将文件保存在 OS 块缓冲区中
我需要在操作系统块缓存中保留尽可能多的大文件,即使它比我可以放入 ram 的要大,而且我正在不断地读取另一个非常大的文件。ATM 当我从另一个文件流式读取时,我将从系统缓存中删除大块的大型重要文件。
c++ - 卸载 DLL 时的内存泄漏是否会导致主机进程泄漏?
考虑这种情况:
此时,调用 malloc() 时分配的 1k 是否会再次可供宿主进程使用?DLL 静态链接到 CRT。
c# - 哪些策略和工具可用于查找 .NET 中的内存泄漏?
我写了 10 年的 C++。我遇到了内存问题,但可以通过合理的努力来解决它们。
在过去的几年里,我一直在编写 C#。我发现我仍然有很多记忆问题。由于不确定性,它们很难诊断和修复,而且因为 C# 的理念是,当你非常肯定地这样做时,你不应该担心这些事情。
我发现的一个特殊问题是我必须明确地处理和清理代码中的所有内容。如果我不这样做,那么内存分析器就没有真正的帮助,因为有太多的谷壳漂浮在你身上,你无法在他们试图向你展示的所有数据中找到泄漏。我想知道我是否有错误的想法,或者我所拥有的工具是否不是最好的。
什么样的策略和工具可用于解决 .NET 中的内存泄漏?