实验目的
测试时间序列ID化后内存空间占用
实验场景
100万时间序列,每个时间序列ID化成32字节的ID,使用哈希表存储,键为ID,值为数据类型及磁盘指针
理论分析
ID占用32字节,数据类型占用1字节,磁盘指针占用4字节
纯数据内存 = 1M * (32 + 1 + 4) = 37MB
必须的JAVA对象(HashMap Node对象,Key对象, Value对象)= 1M * (32 + 16 + 16) = 64MB
理论最小空间占用 = 纯数据内存 + 必须的JAVA对象 = 37 + 64 = 101 MB
实验结果
实际内存占用:104MB
原因分析
JVM虚拟机具有字节对齐的特点,1字节的数据类型被对齐为4字节,故占用空间多了3MB
实验代码
Key
public class Key { byte i1; byte i2; byte i3; byte i4; byte i5; byte i6; byte i7; byte i8; byte i9; byte i10; byte i11; byte i12; byte i13; byte i14; byte i15; byte i16; byte i17; byte i18; byte i19; byte i20; byte i21; byte i22; byte i23; byte i24; byte i25; byte i26; byte i27; byte i28; byte i29; byte i30; byte i31; byte i32; }
Value
public class Value { int pos; byte type; public Value(int pos, byte type) { this.pos = pos; this.type = type; } }
Main
public class Main { private static final int size = 10_000_00; public static void main(String[] args) throws InterruptedException { HashMap<Key, Value> map = new HashMap<>(); // System.out.println(Integer.toBinaryString(-1)); for (int i = 1; i <= size; i++) { map.put(new Key(), new Value(1,(byte) 1)); } System.out.println("finish " + map.size()); Thread.sleep(1000000); } }