Java 堆外Map工具

KV键值对存储大家都很熟悉了,Java 中的 map 都是在堆内存储,如果我们遇到一种情况是map特别大,每次GC我们不想释放这些空间,那么这一部分缓存数据又该如何处理呢?当然大家说可以使用第三方缓存组件:Redis,HBase,MongoDB,今天给大家多一种选择:堆外内存。

今天要给大家介绍的是一款使用堆外内存构建本地缓存行的工具:Chronicle-Map 。官网上给出该工具的特性:

  • 高吞吐量,低延迟,跨进程,持久键值存储;
  • 堆外数据存储,延迟时间为微秒;
  • 基于ConcurrentHashMap;
  • TCP连接;
  • 弹性写入,如果进程终止,则最后一次写入不会丢失;
  • 仅复制最新值即可支持很高的更新率;
  • 超低延迟:在某些测试中,Chronicle Map的目标是读取和写入查询的平均延迟小于1微秒;
  • 高并发性:写查询可以很好地扩展到服务器中硬件执行线程的数量。读取查询永远不会互相阻塞;
  • 磁盘持久性 -(可选);
  • 多主复制 -(可选,商业功能)-最终一致的,完全冗余的服务器间异步复制,默认情况下“最后写入胜出”策略允许实现基于状态的自定义CRDT策略。

下面说一下使用方式:

<dependency>
    <groupId>net.openhft</groupId>
    <artifactId>chronicle-map</artifactId>
    <version>3.17.2</version>
</dependency>

创建一个普通的KV存储:

ChronicleMap<Long, String> userMap = ChronicleMap
  .of(Long.class, String.class)
  .name("user-map")
  .entries(50)
  .create();
userMap.put(1122L,"xiaming");

创建一个String 类型的 map,初始值为50个空间。

创建可持久化的KV存储:

try {
  ChronicleMap<Long, String> persistedUserMap = ChronicleMap
    .of(Long.class, String.class)
    .name("user-map")
    .entries(50)
    .createPersistedTo(new File(System.getProperty("user.home") + "/user.data"));
} catch (IOException e) {
  e.printStackTrace();
}

原文地址:https://www.cnblogs.com/rickiyang/p/12236042.html

时间: 2024-10-14 07:04:41

Java 堆外Map工具的相关文章

google-perftools 分析JAVA 堆外内存

google-perftools 分析JAVA 堆外内存 分类: j2se2011-08-25 21:48 3358人阅读 评论(4) 收藏 举报 javahbasehtml工具os 原文转自:http://koven2049.iteye.com/blog/1142768,所有权利归原作者所有 最近线上运行的hbase发现分配了16g内存,但是实际使用了22g,堆外内存达到6g.感觉非常诡异.堆外内存用一般的工具很难查看,可以通过google-perftools来跟踪: http://code.

java堆外内存 (直接内存)

java堆外内存 (直接内存 非托管内存) 堆外内存的好处是: 可以扩展至更大的内存空间.比如超过1TB甚至比主存还大的空间. 理论上能减少GC暂停时间. 可以在进程间共享,减少JVM间的对象复制,使得JVM的分割部署更容易实现. 它的持久化存储可以支持快速重启,同时还能够在测试环境中重现生产数据. 例如NIO为了高效,提供了ByteBuffer ps:进程间通信的方法除了管道,信号,套接字等常规方法,共享内存,读写文件也可以实现进程间的通信. http://www.importnew.com/

JAVA堆外内存

JVM可以使用的内存分外2种:堆内存和堆外内存. 堆内存完全由JVM负责分配和释放,如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemoryError这个错误. 使用堆外内存,就是为了能直接分配和释放内存,提高效率.JDK5.0之后,代码中能直接操作本地内存的方式有2种:使用未公开的Unsafe和NIO包下ByteBuffer. 关于Unsafe对象的简介和获取方式,可以参考:http://blog.csdn.net/aitangyong/article/det

Java堆外内存的使用

堆外内存的回收见HeapByteBuffer和DirectByteBuffer以及回收DirectByteBuffer 基本类型长度 在Java中有很多的基本类型,比如: byte,一个字节是8位bit,也就是1B short,16位bit,也就是2B int,32位bit,也就是4B long, 64位bit,也就是8B char,16位bit,也就是2B float,32位bit,也就是4B double,64位bit,也就是8B 不同的类型都会按照自己的位数来存储,并且可以自动进行转换提升

Java 堆外内存

入口ByteBuffer.allocateDirect public static ByteBuffer allocateDirect(int capacity) { return new DirectByteBuffer(capacity); } DirectByteBuffer构造函数 DirectByteBuffer(int cap) { // package-private super(-1, 0, cap, cap); boolean pa = VM.isDirectMemoryPag

Java 堆外内存回收原理

原文: https://mp.weixin.qq.com/s?__biz=MzUyMDE1ODQ3NQ==&mid=2247483773&idx=1&sn=24f9eb05ebb39642de4b4951c6b11eaf&chksm=f9efed19ce98640fb65a87b82a85f78fa1eed0e2b5229a4d49a7c17baac95fe5c3ed29086c96&token=1716214908&lang=zh_CN 堆外内存简介Dir

java 堆外内存使用

最大堆外内存的配置 -XX:MaxDirectMemorySize=15g 分配堆外内存 java.nio.ByteBuffer#allocateDirect DirectByteBuffer 类是包权限的,使用 unsafe 分配和回收内存 class DirectByteBuffer extends MappedByteBuffer implements DirectBuffer DirectByteBuffer(int cap) { super(-1, 0, cap, cap); bool

JVM初探- 使用堆外内存减少Full GC

JVM初探-使用堆外内存减少Full GC 标签 : JVM 问题: 大部分主流互联网企业线上Server JVM选用了CMS收集器(如Taobao.LinkedIn.Vdian), 虽然CMS可与用户线程并发GC以降低STW时间, 但它也并非十分完美, 尤其是当出现Concurrent Mode Failure由并行GC转入串行时, 将导致非常长时间的Stop The World(详细可参考JVM初探- 内存分配.GC原理与垃圾收集器). 解决: 由GCIH可以联想到: 将长期存活的对象(如L

JVM - 堆外内存

看了不少资料,总结下: 堆外内存 / 直接内存(Direct Memory)JDK1.4中引入的NIO类,基于channel和Buffer的I/O方式,可用Native库直接分配堆外内存,然后利用一个存储在堆中的DirectByteBuffer对象作为这块内存引用来操作.避免了在Java堆和Native堆中来回复制数据. 优点 1.堆外内存不影响 JVM GC,程序会减少 Full GC. 2 IO 操作使用堆外内存比堆内存快.因为堆内在flush到远程时,会先复制到直接内存(非堆内存),然后在