java回收类_Java垃圾回收,基于类的使用权

我一直在使用Java Garbage Collector的参数,并且随着eden / survivor空间的充满,我看到了昂贵且频繁的次要垃圾收集。这是由于我分配了非常大的对象池。我知道这些对象是" permanment",因为它们被重用,但永远不会被GC化。因此,我试图找到一种在旧一代而不是新一代中"自动"放置这些类型的对象的方法。

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

我希望能够为每个类指定使用率,并将其设置为对于我知道永远不会被GC(而且非常大)的特定对象类而言非常低的值

(在他的情况下,

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

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

这可能吗?我已经搜索了所有可能的JVM标志,但找不到任何能达到这种效果的东西,也看不到使用自定义类加载器完成此操作的方法。

如果您有大量的"永久"对象,则值得评估堆外存储。请注意,这不是标准的Java解决方案。实现示例:github.com/OpenHFT/HugeCollections总体文章:infoq.com/articles/Open-JDK-and-HashMap-Off-Heap

自己进行对象池化几乎总是一个坏主意。但是,如果您真的想创建一个大型的对象池,请查看堆外技术,这些技术将使您避开垃圾收集器

能够基于对象类为GC提供"提示"实际上是一个好主意。我非常确定GC已经为某些系统类做到了这一点,但我从未听说过建议为用户类启用此功能。

(实际上,基于类加载器执行此操作可能会更好,因为可以控制授权,并且您不必枚举所有类。但是由于您无法将相关的类保持在一起,因此这也会带来一些麻烦。(除非一个为所选类添加了@选项或标记界面。)

在我的经验中,"按类指定每个类的使用率","大对象"几乎总是数组,因为很少有类最多具有几十个字段,因此尽管某些非数组对象将大数组固定在内存中,实际空间被数组占用,并且大多数程序都具有任何特定元素类型的大数组和小数组。您是否在处理具有数千个字段的具体课程?

不对,这些确实是包含大型数组的类。我希望以某种方式指定包装类,并且直接在旧数组中分配基础数组。

@ user1018513,这似乎要求malloc对Java堆栈进行自省,以根据调用方推断所有权。也许有启用该功能的配置选项,但我对此表示怀疑,并认为babernathys指针可能是最好的选择。

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值