Java Collection 集合类大小调整带来的性能消耗

Java Collection类的某些具体实现由于底层数据存储基于数组,随着元素数量的增加,调整大小的代价很大。随着Collection元素增长到某个上限,调整其大小可能出现性能问题。

当Collection元素达到内部数组达到最大值后,需要创建新数组,并且将旧数组元素通过Arrays.copyOf方法拷贝到新数组,这就消耗了CPU时间片,并且还需要进行垃圾回收,特别是当Collection对象生命周期较长,已经处于老年代,需要经历一次Full GC才能释放内存。新数组的内存会在年轻代的Eden区分配内存(当对象特别大时,可能不会分配在Eden区),并且需要两次进入Survivor区才能进入老年代,垃圾回收时的标记、清除等操作消耗的性能完全可以在初始化Collection时给定合理大小避免。

当调整数组大小仍有一个问题。新拷贝的数组引用元素可能被JVM分配的位置可能与Collection类中的其他字段引用不在同一块内存存储,这可能导致CPU高速缓存未命中(一般而言,对象与其字段需要同时访问,将对象与其字段放在尽可能相邻位置的内存位置将增加CPU内存命中率),访问字段的时间将会加长(虽然很快)。

注:本文考虑基于数组实现的Collection类,对于以链表如LinkedList、TreeMap等,不做探讨。

时间: 2024-10-06 20:04:44

Java Collection 集合类大小调整带来的性能消耗的相关文章

Java collection 集合类架构

https://www.cnblogs.com/fireflyupup/p/4875130.html Collection List 在Collection的基础上引入了有序的概念,位置精确:允许相同元素.在列表上迭代通常优于索引遍历.特殊的ListIterator迭代器允许元素插入.替换,双向访问,从列表中的制定位置开始(根据index获取index位置的元素).未实现get方法. AbstractList 实现了List中的一些方法,支持随机访问.lastIndexOf通过特殊迭代器能够制定

Java API ——Collection集合类 & Iterator接口

对象数组举例: 学生类: package itcast01; /** * Created by gao on 15-12-9. */ public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() {

JAVA Map集合类简介

了解最常用的集合类型之一 Map 的基础知识以及如何针对您应用程序特有的数据优化 Map. 本文相关下载: · Jack 的 HashMap 测试· Oracle JDeveloper 10g java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 List 和 Map.List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建.存储和操作任何类型对象元素列表.List 适用于按数值索引访问元素的情形. Map 提供了一个更通用的

[Java] Map 集合类简介

Map 的基础知识以及如何针对您应用程序特有的数据优化 Map. java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 List 和 Map.List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建.存储和操作任何类型对象元素列表.List 适用于按数值索引访问元素的情形. Map 提供了一个更通用的元素存储方法.Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值.从概念上

Java中不同的并发实现的性能比较

Fork/Join框架在不同配置下的表现如何? Java 8的并行流也是毁誉参半.并行流(Parallel Stream)的语法糖令人兴奋不已.现在Java中实现并发编程存在多种方式,我们希望了解这么做所带来的性能提升及风险是什么.从经过260多次测试之后拿到的数据来看,还是增加了不少新的见解的,这里我们想和大家分享一下. ExecutorService vs. Fork/Join框架 vs. 并行流 在10年前,Java的并发还只能通过第三方库来实现.然后Java 5到来了,并引入了java.

Java:集合类的区别详解

Java中集合类的区别 Array是数组,不在集合框架范畴之内,一旦选定了,它的容量大小就不能改变了,所以通常在编程中不选用数组来存放. 集合 : 集合对象:用于管理其他若干对象的对象 数组:长度不可变 List: 有顺序的,元素可以重复 遍历:for .迭代 排序:Comparable Comparator Collections.sort() ArrayList:底层用数组实现的List 特点:查询效率高,增删效率低 轻量级 线程不安全 LinkedList:底层用双向循环链表 实现的Lis

如何精确地测量java对象的大小

关于java对象的大小测量,网上有很多例子,大多数是申请一个对象后开始做GC,后对比前后的大小,不过这样,虽然说这样测量对象的大小是可行的,不过未必是完全准确的,因为过程中包含对象本身的开销,也许你运气好,正好能碰上,差不多,不过这种测试往往显得十分的笨重,因为要写一堆代码才能测试一点点东西,而且只能在本地测试玩玩,要真正测试实际的系统的对象大小这样可就不行了,本文说说java一些比较偏底层的知识,如何测量对象大小,java其实也是有提供方法的.注意:本文的内容仅仅针对于Hotspot VM,如

Java Collection Framework概述

文章出自:听云博客 Collection概述 Java collection是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等. Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(Iterator.Arrays和Collections). Java collection 结构图 通过上图我们可以看出 Collection是一个interface Collection有List和Set两大分支. List<E>是一个队列,根据下标索引

一步步优化JVM四:决定Java堆的大小以及内存占用

原文:http://blog.csdn.net/zhoutao198712/article/details/7783070 到目前为止,还没有做明确的优化工作.只是做了初始化选择工作,比如说:JVM部署模型.JVM运行环境.收集哪些垃圾回收器的信息以及需要遵守垃圾回收原则.这一步将介绍如何评估应用需要的内存大小以及Java堆大小.首先需要判断出应用存活的数据的大小,存活数据的大小是决定配置应用需要的Java堆大小的重要条件,也能够决定是否需要重新审视一下应用的内存需求或者修改应用程序以满足内存需