首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >这种技术能阻止Java进行垃圾回收吗?

这种技术能阻止Java进行垃圾回收吗?
EN

Stack Overflow用户
提问于 2018-09-28 07:06:25
回答 1查看 85关注 0票数 3

Colt McAnlis做了a wonderfully entertaining video on preventing the JavaScript garbage collector from slowing down applications

其要点如下:

  1. 当应用程序加载时,实例化应用程序将来可能需要的未使用的对象/类的池。
  2. 当您要实例化新对象时,请改为在池中找到未使用的适当类型的对象,获取该对象,并将其properties.
  3. Utilize object设置为

  1. 使用完毕后,将其标记为“未使用”,以便将来的方法可以使用它。

<>G212

我的问题是,这种方法是否也适用于Java垃圾收集器,或者它是否更难绕过并最终扫描整个堆或其他东西。

这主要是理论上的/好奇的事情。我没有任何依赖于规避垃圾回收的应用程序在开发中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 09:50:28

从某种意义上说,它是“有效的”。但不建议这样做,因为其中有一些重要的问题。

  1. 如果你没有正确地实现它,那就是内存泄漏。问题是“池”需要保持对其所有对象的引用。这就防止了垃圾回收。但是,如果应用程序在处理完对象时不能始终将其标记为“未使用”(例如,bug),则这些对象将永远保持“使用中”。

  • 当GC运行时,它必须遍历池中的所有对象以及它们的所有依赖对象。与允许对象死亡相比,这要做更多的工作。(年轻的无法访问的对象根本不需要扫描。)

  • 在几个GC周期之后,池中的对象将被保留,因为它们的生存期很长。这意味着它们将倾向于导致短期依赖对象,否则可能是可收集的保留,直到旧堆被收集。此外,对永久对象的字段的引用赋值可能会更昂贵,并且可能会使年轻的空间收集花费更长的时间(因为旧的->新引用)。

请注意,您所讨论的对象池类型通常是为了减轻应用程序中过多的GC暂停而提出/执行的。在典型的现代JVM中,有专门为最小化暂停而设计的GC。在大多数Java应用程序中,低暂停收集器是解决此问题的更好选择。(一个例外是高度互动的游戏,任何形式的“滞后”都是不可接受的。)

使用对象池还有其他原因:

用于处理对于initialize.

  • To而言非常昂贵的对象的
  • 用于处理需要限制数量的对象。
  • 用于处理与需要正确管理的外部资源相关联的对象。

示例包括线程池、数据库连接池和HTTP连接池(在典型的HTTP客户端库的幕后)。在适当的情况下,这些肯定是有益的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52546217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档