1.编程学习.txt
UP 返回
1. JDK里面默认的集合元素类型均为对象,实际很多场景存储的是基本数据类型数据。对于这些场景,如果使用jdk的原生集合会将其包装成对象,造成内存的浪费和GC的压力。很多开源组件都有对应的高性能集合实现。使用基本数据类型代替包装类,例如netty fastutil和ES hppc
本文主要使用es hppc的高性能集合实现,优化推荐引擎性能
java一个空object对象至少占16字节(64位开启指针压缩)。其中markword占8个字节,类元指针占4个字节,对齐填充占4个字节。java中一个空string占用内存大小
reference/4+object header/8+cahr[]/16+int/4+char reference/4+padding/4=40byte
因此如果我们将集合的包装类转为基本数据类型,string转为基本数据类型,内存将节省50%以上。而对于gc,很大一部分时间都消耗在对象拷贝上,减少对象大小也会大大降低这一部分时延
<dependency>
<groupId>com.carrotsearch</groupId>
<artifactId>hppc</artifactId>
<version>0.9.0</version>
</dependency>
public static void main(String[] args) {
System.setProperty("java.vm.name", "Java HotSpot(TM) ");
FloatArrayList floatArrayList = new FloatArrayList();
List<Float> floatList = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
floatArrayList.add((float) i);
floatList.add((float) i);
}
System.out.println(ObjectSizeCalculator.getObjectSize(floatArrayList));
System.out.println(ObjectSizeCalculator.getObjectSize(floatList));
}
!!@@202503021.img_1245_641_1@@!!
DOWN 返回