cassandra 堆外内存管理
2017-04-09 15:11
204 查看
为什么需要堆外内存呢
当有一些大内存对象的时候,JVM进行垃圾回收时需要收集所有的这些对象的内存。增加了GC压力。因此需要使用堆外内存。java 分配堆外内存
org.apache.cassandra.utils.memory.BufferPool也有相应的实现方法private static ByteBuffer allocate(int size, boolean onHeap) { return onHeap ? ByteBuffer.allocate(size) : ByteBuffer.allocateDirect(size); }
ByteBuffer.allocate: 分配的是JVM内存,这个还是会被JVM回收
ByteBuffer.allocateDirect() 分配OS本地内存,调用的是操作系统的 unsafe.allocateMemory(size);方法分配内存
unsafe.setMemory(base, size, (byte) 0);内存的起始地址和大小存储在java.nio.DirectByteBuffer对象里。只有DirectByteBuffer对象被回收掉,内存才有可能被回收掉。
内存回收
当没有更多的堆外内存(-XX:MaxDirectMemorySize)的时候,就会触发一次Full-GC.
Cassandra 堆外内存管理
java 提供的堆外内存实现方便,但是有一定缺陷。因为堆外内存是全局的同步锁链表。当多个线程同时检测到堆外内存不够,就会相继的触发full-gccassandra为了提高性能,将下列对象存储在堆外内存
为什么其他的不呢
页缓存 读取磁盘文件
Bloom filter 和compression offset 映射
rows cached
public final AutoSavingCache<RowCacheKey, IRowCacheEntry> rowCache; org.apache.cassandra.service.CacheService.initRowCache() // 调用了OHCProvider方法来实现 // cache object ICache<RowCacheKey, IRowCacheEntry> rc = cacheProvider.create(); AutoSavingCache<RowCacheKey, IRowCacheEntry> rowCache = new AutoSavingCache<>(rc, CacheType.ROW_CACHE, new RowCacheSerializer()); int rowCacheKeysToSave = DatabaseDescriptor.getRowCacheKeysToSave(); rowCache.scheduleSaving(DatabaseDescriptor.getRowCacheSavePeriod(), rowCacheKeysToSave); org.apache.cassandra.cache.OHCProvider OHC 就是off-heap-cache public ICache<RowCacheKey, IRowCacheEntry> create() { OHCacheBuilder<RowCacheKey, IRowCacheEntry> builder = OHCacheBuilder.newBuilder(); // 1.创建rowcache 内存空间 builder.capacity(DatabaseDescriptor.getRowCacheSizeInMB() * 1024 * 1024) .keySerializer(KeySerializer.instance) .valueSerializer(ValueSerializer.instance) .throwOOME(true); return new OHCacheAdapter(builder.build()); }
注1处是调用了ohc-core.jar中OHCacheBuilder来实现堆外内存分配
https://issues.apache.org/jira/browse/CASSANDRA-7438。cassandra目前也将这块的实现抽象出来了,作为一个独立的包,其他的应用也可以调用。
https://github.com/snazy/ohc
row cache 为例
org.apache.cassandra.service.CacheService 管理rowCacherowCache的类型就是上面提到的
public final AutoSavingCache<RowCacheKey, IRowCacheEntry> rowCache;
参考
http://blog.csdn.net/xiaofei_hah0000/article/details/52214592http://docs.datastax.com/en/cassandra/2.1/cassandra/operations/ops_tune_jvm_c.html
相关文章推荐
- (转载)初学者如何熟悉Linux内存管理
- C/C++实战之内存管理
- LCC学习笔记之一 --内存和字符串管理
- C/C++学习----第四章 内存分配及其管理
- [读书笔记]Linux内核对内存的使用(2)分页管理的细节
- C/C++学习----第四章 内存分配及其管理
- (转).NET Framework 自动内存管理机制深入剖析 (C#分析篇)
- 字符内存动态分配管理类(CAutoMem)
- 一个动态内存管理模块的实现
- 评C/C++实战之内存管理
- 一点感慨:作网络通信,其实就是在作内存(缓冲区)管理
- Windows CE 内存管理
- SQL服务器内存有两种基本管理方法:动态分配和静态分配
- Linux 内存管理子系统导读(ZT)
- .NET Framework 自动内存管理机制深入剖析 (C#分析篇)
- Linux 内存管理子系统导读
- .NET Framework 自动内存管理机制深入剖析 (转载)
- 关于红旗5.0内存管理
- 【用C语言写一个内存管理程序】
- Windows 内存管理