在Java中使用大量对象是否存在性能问题

时间:2013-07-31 16:35:01

标签: java algorithm performance garbage-collection

我目前正致力于一个性能是重要考虑因素的系统。它将用于处理大量数据(一些对象类型以百万计)与非平凡算法(考虑Integer Programming问题等)。目前我有一个工作解决方案,它将所有这些数据点创建为对象。

通过将它们视为数组,是否可以获得性能提升?在Java中使用大量对象是否有任何最佳实践(应该避免吗?)。

4 个答案:

答案 0 :(得分:4)

我建议您先使用商用CPU和内存分析器。这将使您了解您的瓶颈是什么。

减少垃圾并使您的记忆更紧凑有助于在您优化代码到您的分析器无法建议任何内容时更多。

您可能希望更好地考虑适合您的CPU缓存的结构,因为这可以将性能提高多达2-5倍。例如您的L3缓存可能是8 MB,比主内存快5倍以上。您可以越多地压缩工作集以适应它。

BTW你的L1缓存是32 KB,再次快了〜10倍。

这一切都假定执行GC的时间不会打扰你。如果您创建了足够多的对象,您可以看到多秒,甚至多分钟的GC停止世界暂停。

答案 1 :(得分:2)

阵列或ArrayLists具有相似的性能,尽管阵列速度更快(最高可达25%,具体取决于您对它们的处理方式)。您可以通过避免盒装基元进行计算来获得显着的性能提升,在这种情况下,唯一的解决方案是使用数组。

除此之外,创建许多短期对象会产生很少的性能成本,除了GC将更频繁地运行(但运行次要GC的成本取决于可访问对象的数量,而不是无法访问的对象)。 / p>

答案 2 :(得分:2)

过早优化是邪恶的。正如理查德在评论中所说,编写代码,看看它是否缓慢,然后改进它。如果你有怀疑写一个例子来模拟高负荷。预先确定这一点的时间是值得的。

但至于你的问题......

是的,与创建基元相比,创建对象更加昂贵。它还占用更多的堆空间(内存)。此外,如果您只使用对象很短的时间,垃圾收集器将不得不更频繁地运行,这将占用一些CPU。

再次,如果你真的需要提高速度,那就担心这个。

答案 3 :(得分:0)

您的算法的原型关键部分,在分离中测试它们,找到最慢,改进,重复。尽可能长时间保持单线程,但始终记录可以并行完成的任务。

最后,你的瓶颈可能是以下任何一个:

  • CPU,因为如果算法计算复杂度=>尝试找到更好的算法(或者如果你只是略低于目标,则并行运行多个CPU,如果你远远低于并行处理将无济于事)
  • CPU因为过多的GC =>配置文件内存,使用低/零GC集合(trove4j等)甚至是原始类型的数组,甚至是来自NIO的直接内存缓冲区,实验
  • 内存 - 优化数据邻近度(使用与缓存大小匹配的分块数组等)。
  • 对并发对象的争论=>恢复单线程设计,尝试无锁同步原语等。