Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java垃圾收集,基于类的期限_Java_Garbage Collection_Latency - Fatal编程技术网

Java垃圾收集,基于类的期限

Java垃圾收集,基于类的期限,java,garbage-collection,latency,Java,Garbage Collection,Latency,我一直在玩Java垃圾收集器的参数,随着eden/survivor空间的填满,我看到了代价高昂且频繁的小型垃圾收集。这是因为我分配了一个非常大的对象池。我知道这些对象是“永久性的”,因为它们被重用,但永远不会被GCD。因此,我试图找到一种方法,将这些类型的对象“自动”放置在旧一代中,而不是新一代中 我目前正在通过分配一个非常大的新一代(以避免非常频繁的小型GCs)来解决这个问题,不幸的是,这意味着每个单独的集合都更昂贵 我希望能够指定每个类的保有率,并将其设置为非常低的特定对象类,我知道这些对象

我一直在玩Java垃圾收集器的参数,随着eden/survivor空间的填满,我看到了代价高昂且频繁的小型垃圾收集。这是因为我分配了一个非常大的对象池。我知道这些对象是“永久性的”,因为它们被重用,但永远不会被GCD。因此,我试图找到一种方法,将这些类型的对象“自动”放置在旧一代中,而不是新一代中

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

我希望能够指定每个类的保有率,并将其设置为非常低的特定对象类,我知道这些对象类永远不会获得GCD(并且非常大) (就他的情况而言,是关于

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

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


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

考虑到热点,没有这样的标志允许您直接在OldGen中分配某些类实例


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

如果您有大量的“永久性”对象,值得评估堆外存储。但是,请注意,这不是一个标准的Java解决方案。实现示例:整篇文章:进行自己的对象池几乎总是一个坏主意。但是,如果您真的打算创建一个大型对象池,请看一下堆外技术,它将允许您跳过这一步垃圾收集器能够基于对象的类向GC提供“提示”实际上是一个好主意。我很确定GC已经对某些系统类这样做了,但我从未听过有人建议对用户类启用此功能。(事实上,基于类加载器进行此操作可能会更好,因为可以控制授权,并且您不必枚举所有类。但这也会带来一些复杂性,因为您无法将相关类保持在一起。(除非为所选类别添加了
@
选项或标记接口。)根据我的经验,重新“指定每个类别的使用率”为“大型对象”几乎总是数组,因为很少有类最多有几十个字段,所以尽管一些非数组对象在内存中固定了大数组,但实际空间被数组占用,而且大多数程序都有任何特定元素类型的大数组和小数组。您是在处理具有数千个字段的具体类吗?