【发布时间】: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