项目中大量使用了HashMap来存储各种数据结构,尤其是SNMP数据和缓存数据。由于HashMap需要有额外的信息来保存整个数据结构,如果在数据量大的情况下内存开销会大于POJO的结构。下面的一组测试可以对比Pojo和Map两种数据结构内存使用情况。
方法
简单数据对象包含三个Field: int/string/long
HashMap包含同样三个数据, int/string and long
通过持有10k记录的POJO对象和HashMap对象来比较内存
利用MemoryAnalyzer分析内存
代码
public class MemUsageCompare {
static Map> mapData = new HashMap<>();
static Map entData = new HashMap<>();
static void mapDataTest(int c) {
for(int i = 0; i < c; i ++) {
String index = i+"";
Map data = new HashMap<>();
data.put("1", i + "");
data.put("2", "abcdefghijklmn" + i);
data.put("3", "" + i);
mapData.put(index, data);
}
}
static void entDataTest(int c) {
for(int i = 0; i < c; i ++) {
String inx = i+"";
DataEntity ent = new DataEntity();
ent.id = i;
ent.name = "abcdefghijklmn" + i;
ent.longData = 1L;
entData.put(inx, ent);
}
}
public static void main(String[] args) throws InterruptedException {
mapDataTest(10000);
entDataTest(10000);
Thread.sleep(100000000);
}
}
class DataEntity {
public int id;
public String name;
public long longData;
}
结果
List Object
10kPOJO对象放在HashMap,占用了1984800字节
10kMap对象放在HashMap,占用了4864944字节
内存比大约为 POJO/HashMap = 0.41/1
POJO对象要比HashMap节省超过一半的内存。当然随着存储出具类型的不同,可能还会有变化,但是总对于需要大量缓存数据的场合,建议还是使用POJO替代Map对象。