Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

背景

Java原生的HashMap受限于Java对象限制,对key和value都必须抽象封装为一个类,其实现为开地址法哈希Java原生的HashMap受限于Java对象限制,对key和value都必须抽象封装为一个类,其实现为闭地址法哈希+红黑树,hash槽中的节点为Node,需要存储左右孩子节点等信息,连同其引用一个Node占用内存为32字节。综上,每存储一个键值对就需要额外48字节的对象头及指针,内存空间开销大。

...

https://github.com/cfelde/BinaryOffheapHashMap/blob/master/README.md

实现原理

使用堆外内存+闭地址法散列,将key和value都序列化为二进制数组,利用unsafe模块直接申请堆外内存存储,每次插入需要序列化,每次查询需要反序列化,由于存储的内容为序列化的二进制数组,不包含指针和对象头,避免了额外的内存开销开地址法散列,将key和value都序列化为二进制数组,利用unsafe模块直接申请堆外内存存储,每次插入需要序列化,每次查询需要反序列化,由于存储的内容为序列化的二进制数组,不包含指针和对象头,避免了额外的内存开销


实验

实验场景

基于海量时间序列元数据场景,测试在内存ID表中两者的性能

...