使用大数据时使用Hashmaps和ArrayLists有多糟糕?

use*_*293 3 java performance jvm arraylist hashmap

我正在将XML文档读入HashMaps,ArrayLists,以便关系在内存中保持不变.我的代码完成了我的工作,但我担心我在这个巨大的地图和列表上执行的迭代或函数调用.目前我工作的xml数据并不是那么庞大.但我不知道如果有的话会发生什么.我需要在使用这些哈希映射的逻辑上执行哪些测试用例?将Java集合用于如此庞大的数据有多糟糕?他们有替代品吗?巨大的数据是否会影响JVM崩溃?

Mic*_*rdt 12

Java集合具有一定的开销,当它们是应用程序的主要数据结构并且有效负载数据由大量小对象组成时,可能会大量增加内存使用量(在极端情况下为20次).OutOfMemoryError即使实际数据远小于可用内存,这也可能导致应用程序终止.

  • ArrayList实际上对于大量元素非常有效,但是当您有大量空列表或仅包含一个元素时效率很低.对于这些情况,您可以使用Collections.emptyList()Collections.singletonList()提高效率.
  • HashMap对于存储在其中的每个元素,它具有相同的问题以及相当大的开销.所以同样的建议适用于ArrayList.如果您有大量元素,可能会有更高效的替代Map实现,例如Google Guava.
  • 当您将原始值(如集合intlong集合)存储在集合中时,最大的开销会发生,因为需要将其作为对象包装.在这些情况下,GNU Trove集合提供了另一种选择.
  • 在具体情况下,问题是您是否真的需要立即将XML中的整个数据保存在内存中,或者是否可以在小块中处理它.如果您的数据可以随意增长,这可能是最佳解决方案.
  • 最简单的短期解决方案是简单地购买更多内存.它很便宜.