要减少内存的消耗,除了使用高效的序列化库以外,还有一个很重要的事情,就是优化数据结构。从而避免Java语法特性中所导致的额外内存的开销,比如基于Java数据结构,以及包装类型。
1、优先使用数组以及字符串,而不是集合类。也就是说,优先用array,而不是ArrayList,LinkedList,HashMap等集合。比如,有个List<Integer> list = new ArrayList<Integer>(),将其替换为int[] arr = new int[]。这样的话,array比list少了额外信息的存储开销,还能使用原始数据类型(int)来存储数据,比integer这种包装类型存储数据,要节省内存的多。
2、避免使用多层嵌套的对象结构。比如说,public class Teacher{private List<Student> students = new ArrayList<Student>()}。这个就是非常不好的例子,因为Teacher内部又嵌套了大量的小Student对象。对于这种情况可以选择特殊的数据结构来进行存储,比如用多层嵌套的JSON字符串就是一个很好的选择。
3、尽量使用int替代String。因为string虽然比list,map等数据结构高效多了,占用内存少,但是他相比int类型还是有额外信息的消耗,比如char数组信息。程序中常用的id,完全可以用string来描述。在spark应用中,id就不要用常用的uuid了,因为无法转成int,就用自增的int类型的id即可。