Java 如果我有数百万个业务对象的多个引用,GC会慢很多吗?

Java 如果我有数百万个业务对象的多个引用,GC会慢很多吗?,java,garbage-collection,Java,Garbage Collection,我有大约1000万个域对象,这些对象必须在内存中的所有应用程序生存期内保留,但可以随时逐个添加或删除。主存储器是HashMap 我的处理可以在基本的foreach循环中完成,但我可以通过映射一些对象字段(如HashMap)来创建索引,从而优化一些操作,这将减少30-100倍的迭代次数,但总的处理量更像是2-5倍 所以问题是,如果我没有存储一个地图,而是存储了5个地图,从而创建了5倍于相同对象的引用,那么对于大约1000万个长寿命对象,GC的速度会慢多少 简而言之,UPD:如果每秒添加/删除约10

我有大约1000万个域对象,这些对象必须在内存中的所有应用程序生存期内保留,但可以随时逐个添加或删除。主存储器是
HashMap

我的处理可以在基本的foreach循环中完成,但我可以通过映射一些对象字段(如
HashMap
)来创建索引,从而优化一些操作,这将减少30-100倍的迭代次数,但总的处理量更像是2-5倍

所以问题是,如果我没有存储一个地图,而是存储了5个地图,从而创建了5倍于相同对象的引用,那么对于大约1000万个长寿命对象,GC的速度会慢多少


简而言之,UPD:如果每秒添加/删除约10M个对象和约1K个对象,那么是否可以使用带装箱键的通用java集合作为索引?

可能几乎没有什么区别。长寿命的物品会被提升到终身使用的区域,而这一区域很少被收集。这需要几代人的时间,直到晋升,直到他们必须从伊甸园复制到生存区。在这里,链接的数量并不重要

所以问题是,如果我没有存储一个地图,而是存储了5个地图,从而创建了5倍于相同对象的引用,那么对于大约1000万个长寿命对象,GC的速度会慢多少

我要说的是,这样的参考文献的数量根本不算在内。但所有地图条目实际上都是对象。然而,1000万听起来并不是一个大数字

简而言之,UPD:如果每秒添加/删除约10M个对象和约1K个对象,是否可以使用带盒装键的通用java集合作为索引

不知道,但是你可以用一些原始的集合来避免它。你就不能试一下吗?有三个有用的优化原则:

  • 别这样
  • 如果你做了,现在就不要做
  • 如果你这样做了,不要在没有测量的情况下做
GC开销可能可以忽略不计,您会发现自己在浪费时间



引用用于将对象标记为“正在使用”,但一旦对象被标记,其他引用将不起任何作用。当然,他们必须被检查,但是这项开销是由推荐人而不是裁判来计算的。所以如果你对一个对象创建一百万个引用,花费您时间的是数百万个对象,而不是单个对象。

我不确定这里是否存在这种情况,但如果您真的担心这种情况下的gc,并且希望更好地控制派生映射的行为,从而控制它们对gc性能的影响,我认为您应该查看java中不同类型的引用(强引用、弱引用、软引用、幻影引用)


还要记住,预优化是万恶之源,尤其是在编程中。

如果引用的数量与旧版本中对象的收集方式无关?gc不应该在收集之前检查对它们的引用,以确定是否应该收集它们吗?旧gen gc中的对象不被认为是yong gen中对象的根吗。参考文献的数量是不相关的,事实上它是非零的。2.GC必须扫描所有可访问的对象3。从旧到新的引用有一种特殊的处理方式,请参见。假设我们有两个数组对象a1[10],其克隆对象a2[10]gc不必同时迭代它们吗?@float_dublin:是的,您有两个对象,因此需要加倍工作。事实上,他们的内容是一样的,这并没有让事情变得更糟。