请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

arena 如何分配内存

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

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

总结一下:

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

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

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

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

正在回答

1回答

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

0 回复 有任何疑惑可以回复我~
  • 提问者 qq_皓月星辰_1 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-06-28 10:21:55
  • triump #2
    不是这样的!1.ChunkList 是放在PoolArean 里的,如果PoolArean 的个数小于worker 线程数,就需要加锁,而且作者在代码里从ChunkList 中去分配内存的时候都加了锁的 2. 只有PoolThreadCache  里的 MemoryRegionCache 才是线程安全的,因为是ThreadLocal 的 .  3.. Netty 的内存分配,并不是预先从系统分配一块大内存,而是在上层应用调用分配接口时,如果此时PoolThreadCache 和 PoolArean 是初始状态或者找不到符合要求的内存,就会直接从系统申请一个Chunk大小内存,然后再初始化相关的数据结构用来管理这个Chunk
    回复 有任何疑惑可以回复我~ 2019-09-14 00:17:18
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信