You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

实验目的

测试时间序列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);
  }

}




  • No labels