arena 如何分配内存

来源:7-12 page 级别内存分配

qq_皓月星辰_1

2018-06-27

老师,netty中一个eventloop对应一个arena,这样的话对应线程就会到对应arena里面分配内存,然后内存分配的时候就不会发生竞争。但是我在源码中也没发现给不同的arena分配不同的连续内存啊。然后直接在chunklist都为空的时候初始化一个poolchunk,但这样的话,多线程下,不又发生内存竞争了吗?不知道我描述清楚没。

我以前写C++的时候自己做过内存池,是先malloc到一块大的内存,比如1G,然后封装到一个类里面,然后给程序调用。但是我在netty没找到这样的代码。网上好多帖子都是说各种内存分配算法,但是我就想知道不同的arena是怎么事先拿到一块“独立的“连续内存的。

总结一下:

  1. 整个用做内存池的内存有多大,何时设置的,如何设置。选Direct内存为例。

  2. 这一整块内存是如何划分给多个arena的,何时划分的。

  3. 如果未划分arena的具体内存地址,那么直接实例化poolchunk不就跟malloc一样了吗,没考虑到多线程问题。

    感谢闪电侠老师,老师,你看到的话,及时给我回复哦,着急,自己没想明白。

写回答

1回答

闪电侠

2018-06-27

每个线程维护一堆chunk,然后默认情况下每个线程只会操作自己的这堆chunk,所以是线程安全的,然后chunk的裸分配是jvm控制的,jvm保证线程安全

0
2
triump
不是这样的!1.ChunkList 是放在PoolArean 里的,如果PoolArean 的个数小于worker 线程数,就需要加锁,而且作者在代码里从ChunkList 中去分配内存的时候都加了锁的 2. 只有PoolThreadCache 里的 MemoryRegionCache 才是线程安全的,因为是ThreadLocal 的 . 3.. Netty 的内存分配,并不是预先从系统分配一块大内存,而是在上层应用调用分配接口时,如果此时PoolThreadCache 和 PoolArean 是初始状态或者找不到符合要求的内存,就会直接从系统申请一个Chunk大小内存,然后再初始化相关的数据结构用来管理这个Chunk
2019-09-14
共2条回复

Java读源码之Netty深入剖析

解析netty各大组件细节,百万级性能调优,设计模式实际运用

2334 学习 · 283 问题

查看课程