垃圾收集器如何比显式内存释放更快?

2024-02-26

我正在读这个, 这里是原始 ps 文件。 http://www.hpl.hp.com/personal/Hans_Boehm/gc/myths.ps)

GC 误区 3:垃圾收集器总是比显式内存释放慢。
GC 误区 4:垃圾收集器总是比显式内存释放更快。

这对我来说真是天大的事。 GC 如何比显式内存释放更快?当它释放内存/使其再次使用时,它本质上不是调用显式内存释放器吗?所以....wtf....这实际上是什么意思?

非常小的物体和大的稀疏物体 堆 ==> GC 通常更便宜, 尤其是对于线程

我还是不明白。这就像说 C++ 比机器代码更快(如果你不明白这句话中的 wtf,请停止编程。让 -1 开始)。经过快速谷歌后,一位消息人士建议,当你有大量内存时,速度会更快。我的想法是,这意味着它根本不会打扰免费。当然,这可以很快,而且我已经编写了一个自定义分配器,它可以做到这一点,而且根本不是免费的(void free(void*p){})在一个不释放任何对象的应用程序中(它仅在终止时释放)并且主要在 libs 和 stl 之类的情况下具有定义。所以...我很确定这会让 GC 更快。如果我仍然想要释放,我想我可以使用一个使用双端队列或其自己的实现的分配器,这本质上是

if (freeptr < someaddr) {
    *freeptr=ptr;
    ++freeptr; 
}
else
{
    freestuff();
    freeptr = freeptrroot;
}

我确信这会非常快。我已经回答了我的问题。从未调用 GC 收集器的情况是它会更快,但是...我确信这不是文档的含义,因为它在测试中提到了两个收集器。我确信,如果 GC 收集器被调用一次,无论使用什么 GC,相同的应用程序都会变慢。如果知道它永远不需要免费,那么可以像我拥有的​​一个应用程序一样使用一个空的免费主体。

无论如何,我发布这个问题是为了进一步了解。


GC 如何比显式内存释放更快?

  1. GC 可以将指针碰撞分配到线程局部生成中,然后依靠复制集合来处理(相对)不常见的撤离幸存者的情况。传统的分配器如malloc经常争夺全局锁和搜索树。

  2. GC 可以通过重置线程本地分配缓冲区而不是调用来同时释放许多死块free依次在每个块上,即 O(1) 而不是 O(n)。

  3. 通过压缩旧块,使更多块适合每个缓存行。改进的局部性提高了缓存效率。

  4. 通过利用额外的静态信息,例如不可变类型。

  5. 通过利用额外的动态信息,例如通过写屏障记录的数据改变堆的拓扑。

  6. 通过使更有效的技术易于处理,例如通过消除无等待算法中手动内存管理的麻烦。

  7. 通过将释放推迟到更合适的时间或将其卸载到另一个核心。 (感谢安德鲁·希尔提出这个想法!)

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

垃圾收集器如何比显式内存释放更快? 的相关文章

  • 我用带有垃圾收集器的语言构建了一个解释器。我需要一个用于解释器的垃圾收集器吗?

    这是一个幼稚的问题 但在我迄今为止看到的教程中并没有拼写清楚 如果我在一种高级语言 不是 C C 等 之上构建一个解释器 并且它有一个垃圾收集器 是否有必要为解释器本身制作一个 如果答案是肯定的 那一定是同一类宿主吧 即 如果主机是标记 清
  • 相当于.net中的SoftReference?

    我熟悉WeakReference 但我正在寻找一个已清除的引用类型only当内存不足时 不仅仅是每次运行 gc 时 就像 Java 的SoftReference 我正在寻找一种实现内存敏感缓存的方法 ASP NET 缓存为您提供了所需的内存
  • ListView 与 getView() 由于不断的 GC 而变得缓慢?

    我的应用程序中有一个 ListView 并且我已经重写了 getView 方法 因此我可以根据行的文本更改行的 ImageView src 问题是 我注意到 ListView 滚动滞后 当我检查 DDMS 时 似乎每次滚动 ListView
  • 查找 Java 中的内存使用情况

    以下是我需要解决的场景 我想出了两种解决方案 我需要维护从数据库获取的数据的缓存 以便在 Swing GUI 上显示 每当我的 JVM 内存超过其分配内存的 70 时 我需要警告用户有关过度使用的情况 一旦 JVM 内存使用率超过 80 那
  • 明确的控制不会处置它们——风险是什么?

    有多个线程 a https stackoverflow com questions 1757116 remove tabpage dispose or clear or both b https stackoverflow com ques
  • 内存泄漏?!在“array_map”中使用“create_function”时,垃圾收集器是否正确?

    我在 StackOverflow 上找到了以下解决方案 从对象数组中获取特定对象属性的数组 PHP 从对象数组中提取属性 https stackoverflow com questions 1118994 php extracting a
  • GC.Add MemoryPressure() 如何知道要向哪个对象添加内存压力?

    我最近需要使用GC 添加内存压力 http msdn microsoft com en us library system gc addmemorypressure aspx令我感到奇怪的是 它不接受添加内存压力的对象作为参数 我认为因为它
  • 在这种情况下垃圾收集器会做什么? [复制]

    这个问题在这里已经有答案了 我试图了解 GC 将如何行动的两种情况 1 有两个对象 object1 和 object2 object1 引用了 object2 object2 引用了 object1 现在 这两个对象都没有被使用 GC 可以
  • 垃圾收集器如何在幕后工作来收集死对象?

    我正在阅读有关垃圾收集的内容 众所周知 垃圾收集会收集死亡对象并回收内存 我的问题是 Collector 如何知道任何对象已死亡 它使用什么数据结构来跟踪活动对象 我正在研究这个问题 我发现GC实际上会跟踪活动对象 并标记它们 每个未标记的
  • 循环内的局部变量会被垃圾收集吗?

    我想知道将循环内引用的任何变量放在循环外是否更有效 或者它们可以像函数内的变量一样被垃圾收集吗 var obj key val for var i 0 i lt 10 i console log obj or for var i 0 i l
  • 蜘蛛猴和垃圾收集

    我正在将 Spidermonkey 嵌入到我的 C 应用程序中 我需要在本机 C 中实现一些传递 jsval 的自定义 Javascript 函数 我需要防止 jsval 被意外垃圾收集 我这样做是否合适 1 在初始化例程中 static
  • 这种双重实例是否有害,或者根本没有必要?

    在仔细阅读遗留资源时 我发现了这一点 DataSet myUPC new DataSet myUPC dbconn getDataSet dynSQL Resharper 正确地将其中的 new Dataset 部分 灰显 并建议 删除多余
  • 应用程序中 GC 长时间暂停

    我当前运行的应用程序需要最大堆大小为 16GB 目前我使用以下标志来处理垃圾收集 XX UseParNewGC XX UseConcMarkSweepGC XX CMSInitiatingOccupancyFraction 50 XX Di
  • JVM锯齿状空闲进程

    我目前正在进行一项涉及 JVM 及其内存使用工作原理的研究 我不明白的是 JVM在空闲时用什么填充它的内存 只是为了在堆几乎达到时释放它 为什么使用的内存不只有一条平线 顺便说一句 这个 java 应用程序托管在 glassfish 上 但
  • 清除堆内存以防止内存不足异常

    我知道已经有人问过有关内存不足的问题 但我没有找到解决方案 在位图工厂中 我出现内存不足异常 甚至使用 inSampleSize 1 所以我经常用 try catch 内存不足异常来包围它 因为这是一个不好的做法 try catch Out
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • 新的自动引用计数机制如何工作?

    有人可以简单地向我解释一下 ARC 的工作原理吗 我知道它与垃圾收集不同 但我只是想知道它到底是如何工作的 另外 如果 ARC 的作用与 GC 的作用相同且不影响性能 那么 Java 为什么要使用 GC 为什么它不使用 ARC 呢 每个接触
  • Python:当为变量分配新内容时,“旧”内存是否被释放?

    如果为变量分配了任何新内容 为 旧内容 分配的内存是否会 正确 释放 例如 在以下脚本中 在为 a 分配一些新内容后 变量 a 作为零数组的内存是否会被释放 import numpy a numpy zeros 1000 a a 1 我想象
  • 如果我再次使其可用,“最终确定”的对象会发生什么情况?

    好吧 我尝试制作一个最终确定的 object 再次可用 我知道 从甲骨文文档 http docs oracle com javase 7 docs api java lang Object html finalize that finali
  • 对于所有 JVM GC 实现来说,压缩真的是不可避免的吗?

    On this link http www azulsystems com technology c4 garbage collector据说 这些暂停是不可避免的压缩要求的结果 堆以释放空间 收藏家使用不同的策略 推迟这些事件 但是压缩是

随机推荐