【问题标题】:Java Garbage Collection, Class Based TenuringJava垃圾收集,基于类的Tenuring
【发布时间】:2014-05-13 23:36:02
【问题描述】:

我一直在使用 Java Garbage Collector 的参数,我发现随着伊甸园/幸存者空间的填满,我看到昂贵且频繁的次要垃圾收集。这是由于我分配了一个非常大的对象池。我知道的这些对象是“永久的”,因为它们被重用但永远不会被 GC。因此,我试图找到一种方法将这些类型的对象“自动”放置在旧代而不是新代中。

我目前正在通过分配一个非常大的新一代来解决这个问题(以避免非常频繁的次要 GC),不幸的是,这意味着每个单独的收集都更昂贵。

我希望能够为每个类指定一个任期率,并将其设置为非常低的特定类的对象,我知道这些对象类我知道它们永远不会被 GC(并且它们非常大) (在他的情况下,它是关于

我的应用程序对延迟非常敏感。

我当前的设置是使用最小/最大堆大小为 48 的 CMS。

这可能吗?我已经搜索了所有可能的 JVM 标志,但找不到任何相关的东西,也找不到使用自定义类加载器的方法。

【问题讨论】:

  • 如果您有大量“永久”对象,那么值得评估堆外存储。但是请注意,这不是标准的 Java 解决方案。实现示例:github.com/OpenHFT/HugeCollections 整体文章:infoq.com/articles/Open-JDK-and-HashMap-Off-Heap
  • 进行自己的对象池几乎总是一个坏主意。但是,如果您真的打算创建一个大型对象池,请查看可让您避开垃圾收集器的堆外技术
  • 能够基于对象的类向 GC 提供“提示”实际上是一个好主意。我很确定 GC 已经为某些系统类执行此操作,但我从未听说过它建议为用户类启用此功能。
  • (实际上,基于类加载器可能会更好,因为可以控制授权并且您不必枚举所有类。但它也会引入一些复杂性,因为您不会'不能将相关的类放在一起。(除非为选定的类添加了@ 选项或标记接口。)
  • 重新“指定,每类,任期率”,以我的经验,“大对象”几乎总是数组,因为很少有类最多有几十个字段,所以虽然一些非数组对象将大数组固定在内存中,实际空间被数组占用,大多数程序都有任何特定元素类型的大数组和小数组。您正在处理具有数千个字段的具体类吗?

标签: java garbage-collection latency


【解决方案1】:

考虑到 Hotspot,没有这样的标志可以让您直接在 OldGen 中分配某些 Class 实例。

如果池真的被重用并且“永久”,那么您应该只在池分配期间获得频繁的次要 gcs。您需要运行您的应用程序更长的时间,并查看该池是否确实是终身的。之后,您应该不会看到由池使用引起的任何次要 GC。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-13
    • 2016-08-16
    • 2013-02-20
    • 1970-01-01
    • 2011-11-07
    • 2011-02-25
    • 2016-03-26
    相关资源
    最近更新 更多